Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 域模型的松散耦合程度如何?_C#_Oop_Architecture_Domain Driven Design - Fatal编程技术网

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'前缀,并使用say
MoneyType:Money
[interface]。我想我实例化域对象的唯一方法是通过抽象工厂,所以我还需要一些抽象工厂。现在,我确实喜欢能够在系统中的“任何地方”实例化具体的域对象,就像BCL的扩展或抽象(这是域模型的一部分,不是吗?)

我可以想象这个系统可以与任何一种架构一起工作,那么这只是一个相互竞争的设计问题的经典案例,还是我完全遗漏了什么

编辑:这个投票率很高的答案似乎表明域模型应该被隔离,每个对象只向系统的其余部分公开一个接口

目前,我觉得这样更好,因为系统的其余部分无法自由访问域对象(因此每次发生更改时都会重新编译它们)。然而,扭转这种依赖关系以实现完全隔离绝非易事,因此我非常愿意接受更多的讨论和答案

更多编辑:所以我尝试了重构,在我开始尝试实现我自己的简单DI容器时,我觉得事情开始变得很糟糕,有点可笑

完全
DomainModel
隔离带来的任何好处都被复杂度和代码行的指数级增长所抵消(至少对我来说是这样)。因此,我对架构进行了重构,使得
DomainModel
只依赖于
Core
,现在它只包含我使用的契约类、自定义集合、注释和公共扩展的设计。我将所有特定于系统的接口和基础设施引入一个新项目
基础设施
,所有子系统服务都依赖于该项目(这里没有特定的技术,因此可能不是典型的基础设施层?)

现在一切都感觉好多了,不过我又回到了我喜欢的具体领域对象。这并不是一个白费力气的练习,因为我发现了
域模型的一些改进和简化,并且能够澄清
核心
并确定
基础设施
的机会

我还有一个核心项目,其中包含了所有特定于系统的 诸如接口、枚举、验证类、扩展和 所有服务共有的其他东西

您描述的是不可知的代码构造和模式,它们本质上不属于特定的层

  • 接口和枚举,只要是关于域概念的,就应该在域层中。其他接口和枚举。。。好吧,只要它们最合适

  • “验证类”也很模糊,但域验证在域中进行,命令验证在应用层进行,用户输入验证在UI中进行,等等

  • 扩展方法可以在任何层中找到

我认为你应该摆脱那些看起来不太连贯的“核心”项目,把它的所有内容分散到适当的项目中

在国际海事组织看来,一切“高级别政策”都应该纳入该领域。所有项目共享的实用程序类都可以放在像project或NuGet包这样的库中,但这些类不应该太多,我也不会称之为Core。

在与DDD非常一致的体系结构中,
层可以进一步扩展