如何将域和存储库层公开为服务?

时间:2013-02-27 15:52:23

标签: c# wcf domain-driven-design domain-model

我目前在申请中有以下图层:

  1. API
  2. AppService Layer
  3. 域名模型
  4. 存储库
  5. 较低(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)的WCF服务,它只是在内部转向并调用域方法似乎仍然是耦合的,而不是提供纯粹的抽象。它仍然会对签名更改敏感。

    我通过不直接公开方法来阅读,我们可以在内部进行更改,而无需修改合同接口。好的,这听起来很棒,但是如果我的内部方法需要一个附加的参数,现在有了签名`ProcessSomeRule(string,string,string),猜怎么着?我的契约接口方法现在会中断,因为它缺少第3个参数,因此我的接口要更改。不知道如何做到这一点,仍然使抽象值得吗?

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

    问题:如何公开域和存储库层的共享行为以及调用这些新图层的名称?新层是否公开名为“域服务”的域并位于“AppService”和“DomainModel”之间?

    最后,如果我走错了路,任何一个都可以随时引导我。谢谢!

2 个答案:

答案 0 :(得分:1)

  

如何公开域和存储库的共享行为   图层和这些新图层的名称会被调用?

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

  

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

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

答案 1 :(得分:0)

我认为将域对象公开为服务并不困难。但系统真的是组合服务和UI。 UI访问服务和服务可以通过不同的方式实现:DDD或数据库中心。因此,告诉服务调用者我们如何实现业务逻辑可能不是一个好主意。