2

我的应用程序中当前有以下层:

  1. API
  2. 应用服务层
  3. 领域模型
  4. 存储库

较低的 (2) 层(域和存储库)提供了跨业务需求的几乎全部重用,因此我想至少将我的域模型公开为服务,可能是 WCF 服务。基本上域实体数据、行为和持久性是可重用的,我需要一种方法来集中公开它。

我已阅读以下内容(与 WCF 服务共享域模型)和类似的内容,这些内容表明为什么直接通过 WCF 公开域实体是有充分理由的。大多数示例表明创建数据合约以公开域数据,然后具有映射机制以在域和 DTO(数据合约)数据之间进行映射。到目前为止,一切都很好。

如果我的域层中有如下方法,如何通过新的 WCF 服务公开它?我以为我只会公开 DTO,因此如何公开我想跨进程重用的共享/公共域行为?

public int ProcessSomeRule(string param1, string param2)

如果答案是在 WCF 服务上创建一个充当代理但仍不ProcessSomeRule直接公开该方法的方法,我对此很满意,但这会产生另一个问题。这种抽象的目的和在名为 example 的 WCF 服务上创建一个方法,ProcessSomeRuleWCF(string,string)它只是在内部转身并调用域方法,似乎仍然是耦合的,而不是提供纯粹的抽象。它仍然对签名更改很敏感。

我读到通过不直接公开方法,我们可以在内部进行更改而无需修改合约接口。好的,这听起来很不错,但是如果我的内部方法需要一个额外的参数并且现在有签名 `ProcessSomeRule(string, string, string),你猜怎么着?我的合约接口方法现在将中断,因为它缺少第三个参数,所以我的接口必须更改。不确定如何做到这一点并且仍然使抽象值得?

我的存储库以同样的方式是通用的,可以跨进程使用,我也想重用这一层。目前我的存储库(UoW)接口被注入到我的 AppService 层,所以我不知道如果 Repository 层是 WCF 服务,这将如何工作。

问题:如何公开域和存储库层的共享行为以及这些新层的名称是什么?新层是否公开了名为“Domain Service”的域并位于“AppService”和“DomainModel”之间?

最后,如果我走错了路,请随时指导我。谢谢!

4

2 回答 2

1

如何公开域和存储库层的共享行为以及这些新层的名称是什么?

六边形(端口和适配器)架构的上下文中,您的领域层将被应用程序服务封装,从而定义您的应用程序的核心。应用程序服务通过委托聚合和域服务以及编排对存储库和基础设施服务的访问来实现用例。接下来,您可以“调整”您的应用程序以适应基础架构。让存储库实现在域层中声明的存储库接口就是一个例子。存储库实现充当域和外部世界之间的适配器。对于 WCF 服务也是如此,通常称为开放主机服务在 DDD 中,它们使您的应用程序适应传输基础设施。WCF 服务或 ASP.NET WebAPI 服务是委托给应用程序服务的一个相对较薄的层。同样,这一层的目的只是用作适配器。该层确实拥有它公开公开的合约。在 DDD 中,这称为已发布语言。例如,在 WCF 中,它将通过DataContractDataMember属性来定义。这些合同是外部系统访问您的域的方式。在已发布的合约和内部域之间有一个缓冲很重要,因为它们可能会以不同的速率变化并具有不同的消费者需求。

新层是否公开了名为“Domain Service”的域并位于“AppService”和“DomainModel”之间?

不,域服务是域层本身的一部分,与实体、聚合和值对象一起存在。

于 2013-02-27T18:26:01.413 回答
0

我认为将域对象公开为服务并不困难。但系统确实是服务和用户界面的结合。UI 访问服务,服务可以通过不同的方式实现:DDD 或 database-central 。所以告诉服务调用者我们如何实现我们的业务逻辑可能不是一个好主意。

于 2015-12-04T14:16:23.623 回答