【发布时间】:2013-02-13 12:21:54
【问题描述】:
我的应用程序中当前有以下层:
- API
- AppService 层
- 领域模型
- 存储库
较低 (2) 层(域和存储库)提供了跨业务需求的几乎全部重用,因此我想至少将我的域模型公开为服务,可能是 WCF 服务。基本上域实体数据、行为和持久性是可重用的,我需要一种方法来集中公开它。
我已阅读以下内容 (Sharing domain model with WCF service) 和类似内容,这些内容表明不 直接通过 WCF 公开域实体的原因很充分。大多数示例表明创建数据合约以公开域数据,然后具有映射机制以在域和 DTO(数据合约)数据之间进行映射。到目前为止一切顺利。
如果我的域层中有如下方法,如何通过新的 WCF 服务公开它?我以为我只会公开 DTO,因此如何公开我想跨进程重用的共享/公共域行为?
public int ProcessSomeRule(string param1, string param2)
如果答案是在 WCF 服务上创建一个充当代理的方法,但仍然不直接公开 ProcessSomeRule 方法,我对此很满意,但这会产生另一个问题。这种抽象的目的和在 WCF 服务上创建一个名为 ProcessSomeRuleWCF(string,string) 的方法,它只是在内部转而调用域方法,似乎仍然是耦合的,而不是提供纯粹的抽象。它仍然对签名更改很敏感。
我了解到,通过不直接公开方法,我们可以在内部进行更改,而无需修改合约接口。好的,这听起来很不错,但是如果我的内部方法需要一个 additional 参数并且现在有签名 `ProcessSomeRule(string, string, string),猜猜怎么着?我的合约接口方法现在会中断,因为它缺少第三个参数,所以我的接口 必须 改变。不确定如何做到这一点并且仍然使抽象值得?
我的存储库以 same 方式是通用的,可以跨进程使用,我也想重用这一层。目前我的存储库 (UoW) 接口被注入到我的 AppService 层中,所以我不知道如果存储库层是 WCF 服务,这将如何工作。
问题:如何公开域和存储库层的共享行为以及这些新层的名称是什么?新层是否公开了名为“Domain Service”的域并位于“AppService”和“DomainModel”之间?
最后,如果我走错了路,请随时指导我。谢谢!
【问题讨论】:
-
每题1题为标准。
-
时间离开WCF,使用Web Api for REST
-
@CuongLe - Web API 实际上用于我的 API 层正在使用的东西,但我更喜欢通过 WCF 对内部公开的服务进行 TCP 调用的速度,目的是重用。小心关于技术使用的笼统陈述——这是一个滑坡。
-
@atconway:只是推荐,如果你想用完TCP,WCF是唯一的办法
-
以这种方式公开“域模型”的问题在于,您在域模型之上强制使用非面向对象的接口。我假设您没有使用贫血的域模型,因此您有很多行为。要在无线接口中对其进行建模,您基本上必须将其简化为 RPC 之类的东西。这真的是你想做的吗?
标签: c# wcf domain-driven-design domain-model