我有一个命令处理程序接口类型,
public interface ICommandHandler<in TCommand>
{
void Handle(TCommand command);
}
实现的命令处理程序是由命令分派对象执行的。
public class CommandDispacher : ICommandDispatcher
{
private readonly IServiceLocator serviceLocator;
public CommandDispacher(IServiceLocator serviceLocator)
{
this.serviceLocator = serviceLocator;
}
public void Dispatch<TCommand>(ICommand command)
{
var commandType = typeof(ICommandHandler<>).MakeGenericType(command.GetType());
var handler = serviceLocator.Resolve(commandType);
((dynamic)handler).Handle((dynamic)command);
}
}
我将命令处理程序类绑定到像下面这样的ninject:
Kernel.Bind(scanner =>
scanner.FromAssembliesMatching("*")
.IncludingNonePublicTypes()
.SelectAllClasses()
.InheritedFrom(typeof(ICommandHandler<>))
.BindSingleInterface());
这个很管用。
但是我需要命令处理程序装饰器,例如验证:
public class PostCommitCommandHandlerDecorator<T> : ICommandHandler<T> where T:ICommand
{
private readonly ICommandHandler<T> decorated;
private readonly PostCommitRegistratorImpl registrator;
public PostCommitCommandHandlerDecorator(ICommandHandler<T> decorated, PostCommitRegistratorImpl registrator)
{
this.decorated = decorated;
this.registrator = registrator;
}
public void Handle(T command)
{
try
{
decorated.Handle(command);
registrator.ExecuteActions();
}
catch (Exception)
{
registrator.Reset();
}
}
}
如何用这样的装饰符来装饰命令处理程序类呢?我是否应该将它绑定到Ninject内核?因为我的命令是由ICommandDispatches对象执行的。
发布于 2015-03-31 16:53:45
Ninject不支持装饰器配置。
但是,您可以使用上下文绑定来实现装饰:
Bind(typeof(ICommandHandler<>))
.To(typeof(PostCommitCommandHandlerDecorator<>));
Bind(typeof(ICommandHandler<>))
.To(typeof(CommandHandler<>))
.When(request =>
request.Target.Type.GetGenericTypeDefinition()
== typeof(PostCommitCommandHandlerDecorator<>));
而不是.When(..)
重载,.WhenInjectedInto(typeof(PostCommitCOmmandHandlerDecorator<>))
可能也能工作,但我怀疑它不会工作。
https://stackoverflow.com/questions/29370021
复制相似问题