我有4层:
>演示层:这是我的WPF客户端应用程序所在的位置.
>应用层:这是我的服务,它应该与业务规则的域服务通信,并且CRUD.它简单地作为Presentation和Domain层之间的反腐层.
>域层:这是我拥有我的聚合,域对象和一些显示业务规则的服务,例如IsTooOld(Person person)
>基础设施层:这是最低层,基础设施在这里,IRepository,IEntity等.
让我们使用这些基于DDD的层次来实现一个简单的场景:在数据库中拥有一个Person对象,映射它,CRUD数据库,检查人的生日并将其显示给用户.
演示层
我将从WPF部分开始.我创建以下类:
> PersonView:XAML视图的人
> Personviewmodel:为ModelView提供功能的viewmodel. PersonView绑定到此,此viewmodel提供PersonModel中的值
> PersonModel:这是我的Personviewmodel紧密耦合的MVVM模型.
域层
这对于表示层来说是足够好的.我现在想连接到数据库来检索一个人物来呈现它.
我必须创建:
>域层中的PersonEntity:数据库实体的聚合,用于与数据库的映射.它位于Domain层.
>域中的人员:这是DDD的域名模型.我会在这里放一些逻辑,我不想像DDD那样发送实体对象.
应用层
好的,我已经有3个人的模型是相当相似的.一些更多的数据访问和服务呢?
>应用程序层中的PersonService:当我的表示层想与该层通信时,需要将其PersonModel(MVVM模型)转换为Person(域模型).应用层中的此服务将Person(域模型)转换为PersonEntity(实体对象),并使用数据库进行CRUD.该服务还使用域层中的另一个PersonService(见下文)来检查/应用一些业务规则.
>域中的PersonService:该层仅适用于Person域对象.它具有像bool IsTooOld(Person person)这样的商业相关规则.
总而言之,我已经结束了7个课程,为一个简单的场景:
> Presentation.WpfClient.View.PersonView
> Presentation.WpfClient.viewmodel.Personviewmodel
> Presentation.WpfClient.Model.PersonModel
> Application.ApplicationServices.PersonService
> Domain.Application.Services.PersonService
> Domain.Application.Models.Person
> Domain.Application.DbEntities.PersonEntity(我创建的原因是我不能使用复杂域对象的映射,所以我只是在这里放一些数据注释,而不是映射域对象)
这感觉很尴尬我不知道我应该如何重新构造它,并有利于域驱动的设计和MVVM模式.我真的很困惑,我真的很期待任何建议或现实生活的例子,以应用MVVM和域驱动的设计.我也为任何关于命名约定或策略的反馈开放,以尽量减少这种简单操作的工作量.
我仍然有两个具体的问题:
>我应该从表现层(MVVM模型)中删除模型,仅使用域层(DDD模型)中的模型?在这一点上是不是违反MVVM?
>我应该将我的实体(数据库)模型与领域模型进行合并?是不是违反DDD?
更新
我采取的决定:
>使用MVVM模型的域模型(删除PersonModel)
>将同一模型的外部映射用于数据库(已删除的PersonEntity已添加PersonMappings).使用持久性模型比简单的映射更昂贵.见:http://enterprisecraftsmanship.com/2016/04/05/having-the-domain-model-separate-from-the-persistence-model/从弗拉基米尔的答案.
最后它看起来像这样:
> Presentation.WpfClient.View.PersonView
> Presentation.WpfClient.viewmodel.Personviewmodel
> Application.ApplicationServices.PersonService(与某些应用程序相关的逻辑)
> Application.ApplicationServices.Mappings(我在这里有存储库抽象和映射)
> Domain.Application.People.Person(人物对象在其有界的上下文中,对象足够聪明地处理域逻辑)
Should I remove models from presentation layer (MVVM models) and use only models from domain layer (DDD models) ? Isn’t it violation of MVVM at this point?
是的,这是一个优选的解决方案,很多情况下,特别是如果你不使用像WCF这样的通信机制. MVVM没有违规,不会强加模型部分的特定实现.
Should I merge my entity (database) models with domain models? Isn’t it violation of DDD?
也是的.将实体分为两个(域实体和“持久性”实体)通常会导致过度复杂和贫血域模型.这里有更多:Having the domain model separated from the persistence model.
总的来说,我建议你看看this的例子.这看起来就像您所需要的:使用MVVM和DDD编写的完整的应用程序.