C# 域模型的松散耦合程度如何?
问题:我是否应该改变依赖关系,让C# 域模型的松散耦合程度如何?,c#,oop,architecture,domain-driven-design,C#,Oop,Architecture,Domain Driven Design,问题:我是否应该改变依赖关系,让DomainModel依赖于Core(包含系统接口和高级策略) 我们是否考虑过富域模型来表示实现细节? Background:因此我将我的DomainModel放在一个单独的项目中,没有传出依赖项。我所有的子系统服务都在不同的项目中,它们彼此都不了解。我还有一个Core项目,该项目包含所有系统特定的内容,如接口、枚举、验证类、扩展和所有服务共有的其他内容,我不会将这些内容归类为低级实现细节Core除了DomainModel之外没有传出依赖项,所有服务都依赖于Cor
DomainModel
依赖于Core
(包含系统接口和高级策略)
我们是否考虑过富域模型来表示实现细节?
Background:因此我将我的DomainModel
放在一个单独的项目中,没有传出依赖项。我所有的子系统服务都在不同的项目中,它们彼此都不了解。我还有一个Core
项目,该项目包含所有系统特定的内容,如接口、枚举、验证类、扩展和所有服务共有的其他内容,我不会将这些内容归类为低级实现细节Core
除了DomainModel
之外没有传出依赖项,所有服务都依赖于Core
,也依赖于DomainModel
我当前的想法:所以我听到过如下设计声明
“域模型不应具有传出依赖项”
而且可能形成对比
“高级策略不应依赖于低级实施细节”
及
“模块应在稳定方向上相互依赖”
<> P>我发现当我开发系统时,域模型的实现变化很大,所有的业务规则和对象都在那里,我不认为大部分的域模型都是稳定的,可能有一些,比如<代码> ValueObjs<代码>(s)。
我认为拥有DomainModel
依赖于Core
的优势在于,高级策略对域模型的实现细节一无所知,域模型也与系统的其余部分隔离开来。事实上,所有其他项目都将依赖于Core
,彼此仍然一无所知。当我在DomainModel
(我在开发过程中经常这样做)中进行更改以构建时,将只重新编译该项目,而不是像目前这样重新编译整个解决方案
我发现,实现这种额外的松耦合的缺点是增加了复杂性?我必须为每个域模型对象创建接口,这些对象将位于Core
中的一个特殊文件夹中。对于这些接口,我还希望去掉'I'前缀,并使用sayMoneyType:Money
[interface]。我想我实例化域对象的唯一方法是通过抽象工厂,所以我还需要一些抽象工厂。现在,我确实喜欢能够在系统中的“任何地方”实例化具体的域对象,就像BCL的扩展或抽象(这是域模型的一部分,不是吗?)
我可以想象这个系统可以与任何一种架构一起工作,那么这只是一个相互竞争的设计问题的经典案例,还是我完全遗漏了什么
编辑:这个投票率很高的答案似乎表明域模型应该被隔离,每个对象只向系统的其余部分公开一个接口
目前,我觉得这样更好,因为系统的其余部分无法自由访问域对象(因此每次发生更改时都会重新编译它们)。然而,扭转这种依赖关系以实现完全隔离绝非易事,因此我非常愿意接受更多的讨论和答案
更多编辑:所以我尝试了重构,在我开始尝试实现我自己的简单DI容器时,我觉得事情开始变得很糟糕,有点可笑
完全DomainModel
隔离带来的任何好处都被复杂度和代码行的指数级增长所抵消(至少对我来说是这样)。因此,我对架构进行了重构,使得DomainModel
只依赖于Core
,现在它只包含我使用的契约类、自定义集合、注释和公共扩展的设计。我将所有特定于系统的接口和基础设施引入一个新项目基础设施,所有子系统服务都依赖于该项目(这里没有特定的技术,因此可能不是典型的基础设施层?)
现在一切都感觉好多了,不过我又回到了我喜欢的具体领域对象。这并不是一个白费力气的练习,因为我发现了域模型的一些改进和简化,并且能够澄清核心
并确定基础设施
的机会
我还有一个核心项目,其中包含了所有特定于系统的
诸如接口、枚举、验证类、扩展和
所有服务共有的其他东西
您描述的是不可知的代码构造和模式,它们本质上不属于特定的层
- 接口和枚举,只要是关于域概念的,就应该在域层中。其他接口和枚举。。。好吧,只要它们最合适
- “验证类”也很模糊,但域验证在域中进行,命令验证在应用层进行,用户输入验证在UI中进行,等等
- 扩展方法可以在任何层中找到
我认为你应该摆脱那些看起来不太连贯的“核心”项目,把它的所有内容分散到适当的项目中
在国际海事组织看来,一切“高级别政策”都应该纳入该领域。所有项目共享的实用程序类都可以放在像project或NuGet包这样的库中,但这些类不应该太多,我也不会称之为Core。在与DDD非常一致的体系结构中,域
层可以进一步扩展