Domain driven design 领域驱动设计-层应如何组织?

Domain driven design 领域驱动设计-层应如何组织?,domain-driven-design,repository,code-organization,project-organization,layer,Domain Driven Design,Repository,Code Organization,Project Organization,Layer,我对软件开发非常陌生。我认为分层体系结构是减少面向对象软件开发过程中出现的复杂性的一种很好的方法,更不用说保持代码的组织性了 我对学习领域驱动设计方法很感兴趣,为了让自己了解它,我遇到了一些问题(当然是初学者级别的问题)。 给你- 我想构建一个应用程序,将个人相关数据保存在数据库中,并在WPFDataGrid中显示个人详细信息(我知道,DDD绝对不适用于如此规模的应用程序,只是为了让像我这样的业余爱好者保持简单)。因此,我创建了一个域类“Person”,类似于—— 公共类人物 { 公众人物(数据

我对软件开发非常陌生。我认为分层体系结构是减少面向对象软件开发过程中出现的复杂性的一种很好的方法,更不用说保持代码的组织性了

我对学习领域驱动设计方法很感兴趣,为了让自己了解它,我遇到了一些问题(当然是初学者级别的问题)。
给你-

我想构建一个应用程序,将个人相关数据保存在数据库中,并在WPF
DataGrid
中显示个人详细信息(我知道,DDD绝对不适用于如此规模的应用程序,只是为了让像我这样的业余爱好者保持简单)。因此,我创建了一个域类“Person”,类似于——

公共类人物
{
公众人物(数据类型paramA)
{
this.PropertyA=paramA;
}
私有数据类型_fieldA;
公共数据类型属性a
{
//封装_fieldA
}
公共数据类型PropertyX
{        
//一些操纵私有字段的代码
}
专用数据类型方法PQR(数据类型参数)
{        
//一些代码
}
}
现在,我对DDD的理解是,体系结构(最简单的版本)应该如下所示(如果我错了,请纠正我)

注:

  • 我希望将
    数据网格
    绑定到某个
    可观察集合
    ,以立即反映任何类型的更改

  • 它是一个WPF应用程序,但不一定是MVVM模式,我有意使用代码隐藏

  • 我的问题是-

  • 什么类型的代码属于
    应用层

  • 我的猜测是,我绝对不应该将我的域对象(即
    Person
    )的
    ObservableCollection
    绑定为
    DataGrid
    ITMSource
    。那么我应该从域对象中提取什么类型的对象,以及如何提取

  • 要在
    表示层
    域层
    之间保持解耦,可能有一种约定,如
    从不直接在表示层中实例化域对象
    。那么,
    非直接
    方法是什么

  • 如果代码隐藏与
    应用层
    对话,那么
    应用层
    是否应与
    数据存储库
    对话?但是如果需要某种与数据访问无关的域访问(可能不在本应用程序中,但可能发生,对吗?)在这种情况下,
    应用层
    应该与
    域层
    中的
    X
    家伙(子层/模块)是谁

  • 我知道我的问题是非常业余的水平,但他们确实是问题,从我面临的问题中提出,以获得一个清晰的画面。因此,如果任何人有时间,我们将不胜感激

    编辑:我不确定
    数据存储库
    是否应该参考
    域模型

    就更“经典”的DDD而言,是的域对象通常不允许位于域之外的任何地方。但在表示层中不使用域对象并不是绝对的规则。例如,裸对象代表直接使用域对象的思想流派。我本人主要坚持一种理念,即不直接使用域对象,因此我不熟悉他们建议的所有实践,我个人认为直接绑定到域对象是不明智的,但是。。。请记住,并非所有人都认为这是一项要求

    如果不允许域对象位于域本身之外,则通常会使用DTO或数据传输对象,这些对象只是具有属性的类,而此类DTO类没有域行为。DTO通常准确地反映域模型结构,但不一定要这样

    业务逻辑应该在域模型中实现,因此应用层中的许多内容都涉及到协调各种服务,通常是将数据带到客户机应用程序中或从客户机应用程序中带出。许多人为此使用某种形式的SOA或至少web服务。这些组件调用存储库,但也需要其他组件(如汇编器)获取从存储库调用返回的域对象,并将属性值复制到DTO中,然后DTO可序列化并返回给调用方。调用者通常是演示者或控制器,但如果不使用MVC或MVP,调用者仍将位于演示层。反向过程更复杂-UI可能会发回表示更新的DTO或表示要添加的新对象的DTO。应用层的主要目的是协调这些来回的活动

    关于域层的“非数据访问”,有几个典型的例子。大多数人通常将“X”组件称为域服务。域服务与应用程序服务的不同之处在于它与域模型的接近程度以及实际业务逻辑的存在

    例如,如果一个应用程序涉及某种订单安排,那么实际上有两个问题-订单安排和订单履行。应用程序服务将制定订单安排所需的数据传输到UI,然后返回用户希望安排的订单。但这只是中介数据传输,应用程序服务也就到此为止。然后,可能需要一个域服务来应用业务规则并构造实际实现该顺序所需的其他域对象

    总的来说,我发现这是一个有用的概念或隐喻,可以应用于许多场景——应用程序服务促进了某些sor的请求