我目前有一个命令处理接口,由几个不同的类针对不同的命令类型实现。我将装饰器模式与 IoC 容器(在我的情况下为 Unity)结合使用,为这些处理程序添加横切关注点,因此我创建了一些类,例如:
- ValidatorCommandHandlerDecorator
- LoggingCommandHandlerDecorator
- AsyncCommandHandlerDecorator
这一切都按预期工作,实际上非常好。这里的潜在问题是每个装饰器实现都会检查接口的代码协定。我想通过只验证一次合同(最好在最外面的装饰器上)来潜在地避免这种情况。
是否有开箱即用的东西来实现这一目标?如果没有,您有什么建议来克服这个问题?
通用接口和合约类是这样的:
[ContractClass(typeof(CommandHandlerContracts<>))]
public interface ICommandHandler<TCommand>
{
void Handle(TCommand command);
}
[ContractClassFor(typeof(ICommandHandler<>))]
internal abstract CommandHandlerContracts<TCommand>
: ICommandHandler<TCommand>
{
public void Handle(TCommand command)
{
Contract.Requires<ArgumentNullException>(
command != null);
}
}
ValidatorCommandHandler(作为我如何实现它们的一个例子)看起来像这样:
public sealed class ValidatorCommandHandlerDecorator<TCommand>
: ICommandHandler<TCommand>
{
private ICommandHandler<TCommand> m_decoratedHandler;
private ICommandValidator<TCommand> m_commandValidator;
public ValidatorCommandHandlerDecorator(
ICommandHandler<TCommand> decoratedHandler,
ICommandValidator<TCommand> commandValidator)
{
m_decoratedHandler = decoratedHandler;
m_commandValidator = commandValidator;
}
public void Handle(TCommand command)
{
m_commandValidator.Validate(command);
m_decoratedHandler.Handle(command);
}
}
即使我创建了另一个仅用于装饰器的接口,它也必须继承原始接口并且仍然会检查合同,所以我不知道该怎么做。
这是 .NET 4.0 / VS2012,如果有帮助的话,我正在使用最新版本的代码合同。