首页 文章

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

提问于
浏览
2

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

  • API

  • AppService层

  • 域模型

  • 存储库

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

我已经阅读了以下内容(Sharing domain model with WCF service)和类似的内容,表明为什么不直接通过WCF公开域实体 . 大多数示例表明创建数据 Contract 以公开域数据,然后具有映射机制以在域和DTO(数据 Contract )数据之间进行映射 . 到现在为止还挺好 .

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

public int ProcessSomeRule(string param1, string param2)

如果答案是在作为代理的WCF服务上创建一个方法仍然没有直接暴露 ProcessSomeRule 方法,我很酷,但这会产生另一个问题 . 这个抽象的目的是在WCF服务上创建一个名为例如 ProcessSomeRuleWCF(string,string) 的方法,它只是在内部转向并调用域方法似乎仍然是耦合的,并不提供纯粹的抽象 . 它仍然会对签名更改敏感 .

我通过不直接公开方法来阅读,我们可以在内部进行更改,而无需修改 Contract 接口 . 好的,根据定义,这听起来很棒,但是如果我的内部方法需要一个额外的参数,现在有了签名`ProcessSomeRule(string,string,string),猜猜是什么?我的 Contract 接口方法现在会破坏,因为它缺少第3个参数,所以我的界面必须改变 . 不知道如何做到这一点,仍然使抽象有 Value ?

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

Question: 如何公开域和存储库层的共享行为以及调用这些新层的名称?新图层是否公开名为'Domain Service'的域并位于'AppService'和'DomainModel'之间?

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

2 回答

  • 1

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

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

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

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

  • 0

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

相关问题