- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我目前有一个命令处理接口(interface),由几个不同的类针对不同的命令类型实现。我将装饰器模式与 IoC 容器(在我的例子中是 Unity)结合使用来为这些处理程序添加横切关注点,因此我创建了一些类,例如:
这一切都按预期工作,实际上非常好。这里的潜在问题是为每个装饰器实现检查接口(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/
我正在开发适用于 Wordpress 的 PSD,并面临着根据颜色过度对齐背景图像或相反的问题。 在桌面上一切都很好,但在移动设备上背景图像变小了(我使用了 background-size: 100%
在标准 Modelica 流体流量源中,通常指定流量或压力。例如,以下边界设置(P 表示压力边界,F 表示流量边界)通常会围绕管道组件: P - 管道 - P F - 管道 - P 但是,有时在同一侧
我正处于设计基于 Azure 的应用程序的早期阶段。考虑到我可能预期的需求的变化性,Azure 吸引我的地方之一是它的可扩展性。因此,我试图保持事物松散耦合,以便我可以在需要时添加实例。 我看到的关于
我与 Xcode 4 dot notation code sense problem 正好相反!点符号的代码完成不仅显示属性,还显示我的方法(在每个完成的左侧标记 P 或 M 分别指示它是属性还是方法
我是一名优秀的程序员,十分优秀!