【问题标题】:Empty ICommand and IQuery interfaces when implementing CQRS实现 CQRS 时为空的 ICommand 和 IQuery 接口
【发布时间】:2020-01-20 00:43:56
【问题描述】:

我一直在阅读有关 CQRS 的信息,并在谷歌上搜索了一些示例。在这个过程中,我找到了GitHub repo for the Pluralsight course "CQRS in practice"(不幸的是我现在无法访问该课程)。我正在查看源代码,然后我注意到一开始我感到尴尬的事情:有两个接口ICommandIQuery,它们只是留空。换句话说:

public interface ICommand { }
public interface IQuery<TResult> { }

之后所有命令都将实现ICommand,所有查询都将实现IQuery&lt;TResult&gt;

但这对我来说很尴尬。接口是合约。实现它的类将签署合同并保证具有指定的方法。这里没有任何方法。所以我真的不明白为什么有人会这样做。

那么有一个空白界面有什么意义呢?为什么有人会创建和实现不定义任何合约的接口?

【问题讨论】:

  • 是marker接口模式。例如,它只是告诉您哪些具体类应该用作ICommand。你通常会有IHandleCommand&lt;T extends ICommand&gt;。有时您可以为此使用注释而不是标记接口,但我相信大多数语言(可能是所有语言)中的注释都不能使用泛型类型。

标签: oop interface cqrs object-oriented-analysis


【解决方案1】:

这里的一个很好的参考是 Effective Java,作者 Joshua Bloch:

使用标记接口定义类型

标记接口是一个不包含方法声明而只是指定(或“标记”)实现该接口的类具有某些属性的接口。

由于标记接口定义了一个类型,您可以使用类型检查器在编译时而不是在运行时捕获某些类别的错误。

Bloch 提出了一个特定的问题:“我是否可以编写一个或多个只接受具有此标记的对象的方法?”

在 DDD 的情况下,您是否想编写一个只接受 ICommand 或 IQuery 的方法?

在快速浏览了 Khorikov 的示例后,对我来说,他需要定义一个类型并不明显——注解,甚至是评论,可能是更好的选择。

【讨论】:

    猜你喜欢
    • 2010-10-03
    • 2010-11-30
    • 2017-07-31
    • 2011-01-09
    • 2012-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多