【发布时间】:2012-11-15 14:02:47
【问题描述】:
问这个问题的原因是我一直想知道如何将所有这些不同的概念拼接在一起。有很多关于 DDD、依赖注入、CQRS、SOA、MVC 的示例和讨论,但关于如何以灵活的方式将它们组合在一起的示例并不多。
我的目标:
- 开发只需很少或无需修改即可独立运行的模块
- 更改或修改 UI 应尽可能简单(即 UI 应尽可能少做,并且“愚蠢”
- 使用记录在案的模式和原则
为了更容易提出具体问题,主要架构现在如下所示:
该示例显示了如何向员工添加注释。员工管理是一种有界上下文。 Employee 有几个属性,其中一个是ICollection<Note>。
绑定上下文在我的理解中是分隔代码的逻辑位置。每个 BC 都是一个模块。大多数时候,我发现他们每个人都可以在需要时保证自己的 UI(即某些模块可能可用于 Windows phone)。
域包含所有业务逻辑。
基础架构包含存储库实现,以及发送邮件、保存文件和不属于域的实用程序的服务。我正在考虑制作一些我必须在多个域(如发送电子邮件)中使用的通用服务功能,作为一种 API,我可以引用它来保存一些跨多个 BC 实现相同事物的代码。
查询层包含我在存储库中获取对象所需的除 GetById 之外的所有查询。查询层可以查询其他持久化实例,并且可能需要为每个 UI 更改一些。
Wcf 或 Web Api 是我的应用程序层,它可能属于基础设施而不是外部。该服务还设置了依赖关系,因此 UI 需要做的就是询问信息并发送命令。
该过程从蓝色箭头开始。阅读模型,因为它包含大部分信息。
在第 1 步中,本示例中的 EmployeeDto 只是一些员工属性,用于向用户显示他们需要记录的员工的相关信息(例如关于新体验的注释或类似内容)。
所以,问题是:
- 实现这样的分层架构真的需要这么多的映射,还是我错过了什么?
- 是否推荐(甚至是智能)使用 Wcf 服务来运行这样的主逻辑(它实际上是我的应用程序服务)
- 在我的 UI 层中没有我的域对象的情况下,是否有 Wcf 的替代方案?
这个实现有什么问题吗?有什么需要注意的坠落坑?
你有什么好的例子可以推荐看看,可以帮助我理解所有这些概念应该如何协同工作。
更新: 我现在已经阅读了大部分文章(相当多的阅读),除了付费书籍(需要更多时间)。它们都是非常好的指针,将 Wcf 更多地视为适配器的方式似乎是对问题 2 的一个很好的回答。如果我打算走那条路,JGauffins 在他的框架上的工作也很有趣.
但是,正如在下面的一些 cmets 中提到的,我觉得其中一些示例倾向于推荐或实现事件和/或命令源、消息总线等。对我来说,现在就计划这种级别的扩展是过大的。与许多业务应用程序一样,这是一个“大量”(就内部应用程序而言,认为最多几千个)用户处理大量数据,而不是需要实现事件和命令的高度协作域队列通常与 CQRS 相关联来解决这个问题。
基于下面的答案,我将开始使用的方法将基于上面的模型和这样的答案:
我只需要处理映射。利大于弊。
我会将应用程序服务拉回基础架构并 将 Wcf 视为“适配器”
我将使用命令对象并发送到应用程序服务。不是 用域对象污染我的域。
为了降低复杂性,我尝试在没有事件/命令的情况下进行管理 采购、消息总线等。
此外,我只是想链接到this blog post by Udi Dahan 关于 CQRS,我认为这样的事情可以降低复杂性,除非真的需要它们。
【问题讨论】:
-
对问题 1 感兴趣:Is Layering Worth the Mapping?.
-
如果你很好地设计了你的 WCF 或 Web API(问题 2),它将是命令和查询的薄包装,并且几乎免维护。有趣的文章:Writing Highly Maintainable WCF Services
-
@Steven 感谢您的文章!我会浏览它们。
-
我发现这非常有用 (msdn.microsoft.com/en-us/library/jj554200.aspx)。我认为这可能对您的一些问题有所帮助。
-
谢谢。您是否建议一直使用事件溯源?我已经阅读了很多关于它的内容,但是由于就许多人处理一小部分数据而言,这不是一个高度协作的领域——它更像是许多人处理一组相当大的数据,所以我发现Udi Dahan 的这篇文章在 CQRS 方面非常有趣:udidahan.com/2011/10/02/….../
标签: c# wcf design-patterns architecture domain-driven-design