【发布时间】:2016-02-04 10:51:22
【问题描述】:
我有以下命令处理程序接口:
public interface ICommandHandler<TCommand> where TCommand : ICommand
{
void Handle(TCommand command);
}
我正在使用以下具体类装饰此接口的实例:
public class ValidationCommandHandlerDecorator<TCommand> : ICommandHandler<TCommand>
where TCommand : ICommand
{
public ValidationCommandHandlerDecorator(
IValidator<TCommand> validator,
ICommandHandler<TCommand> handler)
{
}
public void Handle(TCommand command) { }
}
但是....我不一定要装饰所有命令处理程序,而只想装饰ICommandHandler<TCommand> IF 一个实例存在/注册IValidator<TCommand> 的具体类型的TCommand。注意IValidator<TCommand> 实例是在装饰器类的构造函数中注入的。
例如,如果我有一个命令处理程序:
public class CreateFooCommandHandler : ICommandHandler<CreateFooCommand>
如果我注册了以下实例,我只想装饰:
public class CreateFooCommandValidator : IValidator<CreateFooCommand>
如果CreateFooCommandValidator 不存在,那么我不想用ValidationCommandHandlerDecorator 装饰CreateFooCommandHandler。
我在注册 SimpleInjector 时使用以下内容:
var container = new Container();
container.Register(typeof(ICommandHandler<>), assemblies);
container.Register(typeof(IValidator<>), assemblies);
container.RegisterDecorator(
typeof(ICommandHandler<>),
typeof(ValidationCommandHandlerDecorator<>));
如果任何给定的ICommandHandler<> 不存在IValidator<> 的实例,这显然会失败。对于信息,assemblies 是用于注册泛型类的程序集的集合。
如果可能的话,我应该使用什么来注册装饰器/验证器以实现我想要做的事情?我不想切换使用 SimpleInjector。
此外,如果可能的话,这是推荐的还是违反了 SOLID 原则,甚至只是代码异味?
【问题讨论】:
标签: c# .net simple-injector