Autofac 和通用命令模式
Autofac and generic command pattern
我正在尝试装饰我的命令处理程序,我正在尝试在我的处理器中解析它们。
我这样注册了我的命令:
builder.RegisterAssemblyTypes(typeof(ICommandProcessor).Assembly)
.AsClosedTypesOf(typeof(ICommandHandler<,>))
.AsSelf().AsImplementedInterfaces().Named("implementor", typeof(ICommandHandler<,>));
builder.RegisterGenericDecorator(
typeof(CatchValidationErrorsDecorator<,>),
typeof(ICommandHandler<,>), fromKey: "implementor")
.AsImplementedInterfaces();
问题是当我不使用命名扩展时,通用装饰器不工作。
当我使用命名扩展时,我无法像这样解析我的组件:
var handerType = typeof (ICommandHandler<,>)
.MakeGenericType(command.GetType(), typeof (TResult));
dynamic handler = _container.Resolve(handerType);
有人知道如何解决这个问题吗?
过去这让我很头疼。最终为我完成的注册是:
var assembly = typeof(ICommandProcessor).Assembly);
builder.RegisterAssemblyTypes(assembly).As(type =>
from interfaceType in type.GetInterfaces()
where interfaceType.IsClosedTypeOf(typeof(ICommandHandler<,>))
select new KeyedService("implementor", interfaceType));
builder.RegisterGenericDecorator(
typeof(CatchValidationErrorsDecorator<,>),
typeof(ICommandHandler<,>),
fromKey: "implementor");
我正在尝试装饰我的命令处理程序,我正在尝试在我的处理器中解析它们。
我这样注册了我的命令:
builder.RegisterAssemblyTypes(typeof(ICommandProcessor).Assembly)
.AsClosedTypesOf(typeof(ICommandHandler<,>))
.AsSelf().AsImplementedInterfaces().Named("implementor", typeof(ICommandHandler<,>));
builder.RegisterGenericDecorator(
typeof(CatchValidationErrorsDecorator<,>),
typeof(ICommandHandler<,>), fromKey: "implementor")
.AsImplementedInterfaces();
问题是当我不使用命名扩展时,通用装饰器不工作。 当我使用命名扩展时,我无法像这样解析我的组件:
var handerType = typeof (ICommandHandler<,>)
.MakeGenericType(command.GetType(), typeof (TResult));
dynamic handler = _container.Resolve(handerType);
有人知道如何解决这个问题吗?
过去这让我很头疼。最终为我完成的注册是:
var assembly = typeof(ICommandProcessor).Assembly);
builder.RegisterAssemblyTypes(assembly).As(type =>
from interfaceType in type.GetInterfaces()
where interfaceType.IsClosedTypeOf(typeof(ICommandHandler<,>))
select new KeyedService("implementor", interfaceType));
builder.RegisterGenericDecorator(
typeof(CatchValidationErrorsDecorator<,>),
typeof(ICommandHandler<,>),
fromKey: "implementor");