gpt4 book ai didi

.net - Contract.Requires 和装饰模式。如何避免过度检查条件?

转载 作者:行者123 更新时间:2023-12-02 05:07:57 26 4
gpt4 key购买 nike

我目前有一个命令处理接口(interface),由几个不同的类针对不同的命令类型实现。我将装饰器模式与 IoC 容器(在我的例子中是 Unity)结合使用来为这些处理程序添加横切关注点,因此我创建了一些类,例如:

  • 验证器命令处理程序装饰器
  • LoggingCommandHandlerDecorator
  • AsyncCommandHandlerDecorator

这一切都按预期工作,实际上非常好。这里的潜在问题是为每个装饰器实现检查接口(interface)的代码契约。我想通过只验证一次合约(最好是在最外层的装饰器上)来避免这种情况。

是否有开箱即用的方法来实现这一点?如果没有,您有什么建议来克服这个问题?

通用接口(interface)和契约类是这样的:

[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);
}
}

即使我创建了另一个仅用于装饰器的接口(interface),它也必须继承原始接口(interface)并且仍然会检查契约,所以我不确定该怎么做。

这是 .NET 4.0/VS2012,我使用的是最新版本的 Code Contracts,如果有帮助的话。

最佳答案

如果专注于在调用的每个 Handle(ICommand) 上验证契约(Contract)。我会说没关系,因为那是预期的,因为不能保证包装器将传递给装饰器链中的 wrap-pee 的内容,即使收到非空命令也是如此。

关于.net - Contract.Requires 和装饰模式。如何避免过度检查条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15972830/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com