【问题标题】:How to expose domain and repository layer as a service?如何将域和存储库层公开为服务?
【发布时间】:2013-02-13 12:21:54
【问题描述】:

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

  1. API
  2. AppService 层
  3. 领域模型
  4. 存储库

较低 (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


【解决方案1】:

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

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

新层是否公开名为“域服务”的域并坐 在“AppService”和“DomainModel”之间?

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 2011-04-02
      • 2017-09-19
      • 2011-03-15
      • 2015-01-03
      • 1970-01-01
      相关资源
      最近更新 更多