在WPF应用程序中使用MVVM和DDD而不需要太多类

U. *_*lle 17 architecture wpf design-patterns domain-driven-design mvvm

我有一个WPF应用程序,我想为表示层应用MVVM,为整个应用程序应用DDD.我对如何应用架构非常困惑.你可以给我一些建议,因为我觉得我现在完全搞砸了以下设计尝试:

我有4层:

  • Presentation Layer :这是我的WPF客户端应用程序所在的位置.

  • Application Layer:这是我的服务,我们应该与业务规则的域服务进行通信,并进行CRUD.它只是作为层Presentation和层之间的反腐败层Domain.

  • Domain Layer :这是我有我的聚合,域对象和一些显示业务规则的服务的地方,例如 IsTooOld(Person person)

  • Infrastructure Layer:这是最低层,基础设施就在这里IRepository,IEntity等等.

让我们用这些基于DDD的层实现一个简单的场景:在数据库中有一个Person对象,映射它,CRUD数据库,检查人的生日并将其显示给用户.


表达层

我将从WPF部分开始.我创建了以下类:

  • PersonView :XAML视图的人

  • PersonViewModel:ViewModel提供功能PersonView.PersonView绑定到这个,这ViewModel提供了来自的价值PersonModel

  • PersonModel:这是我PersonViewModel紧密耦合的MVVM模型.


域层

这对于表示层来说已经足够了.我现在想连接到数据库以检索人物对象以呈现它.

我必须创造:

  • PersonEntityin Domain Layer:数据库实体的聚合,用于与数据库的映射.它位于Domain层中.

  • Personin Domain Layer:这是DDD的域模型.我会在这里提出一些逻辑,我不想像DDD建议的那样发送实体对象.


应用层

好的,我已经有3个人模特彼此非常相似.如何进行数据访问和服务呢?

  • PersonServicein Application Layer:当我的表示层想要与该层通信时,它需要将其PersonModel(MVVM模型)转换为Person(域模型).然后,应用程序层中的此服务将Person(域模型)转换为PersonEntity(实体对象)并对数据库执行CRUD.此服务还使用PersonService域层中的另一个(见下文)来检查/应用某些业务规则.

  • PersonServicein Domain Layer:此图层仅适用于Person域对象.它有与业务相关的规则bool IsTooOld(Person person).


总而言之,我最终得到了7个类的简单场景:

  1. Presentation.WpfClient.View.PersonView
  2. Presentation.WpfClient.ViewModel.PersonViewModel
  3. Presentation.WpfClient.Model.PersonModel
  4. Application.ApplicationServices.PersonService
  5. Domain.Application.Services.PersonService
  6. Domain.Application.Models.Person
  7. Domain.Application.DbEntities.PersonEntity (我创建这个的原因是我不能使用复杂域对象的映射,所以我只是在这里放一些数据注释而不是映射域对象)

这感觉非常尴尬.我不确定如何重新构建它并使域驱动设计和MVVM模式受益.我真的被卡住了,我真的很期待任何建议或现实生活中的例子来应用MVVM和域驱动设计.我也愿意接受有关命名约定或策略的任何反馈,以便为简单操作减少这么多工作.

我仍然有两个具体的问题:

  1. 我应该从表示层(MVVM模型)中删除模型并仅使用域层(DDD模型)中的模型吗?这点不违反MVVM吗?

  2. 我应该将我的实体(数据库)模型与域模型合并吗?是不是违反了DDD?


更新

我做出的决定:

最后它看起来像这样:

  1. Presentation.WpfClient.View.PersonView
  2. Presentation.WpfClient.ViewModel.PersonViewModel
  3. Application.ApplicationServices.PersonService (与一些应用程序相关的逻辑)
  4. Application.ApplicationServices.Mappings (我在这里有存储库抽象和映射)
  5. Domain.Application.People.Person (人物对象在它的有界上下文中,对象足够智能来处理域逻辑)

Vla*_*mir 11

对于单个概念来说,这是太多的类.

我应该从表示层(MVVM模型)中删除模型并仅使用域层(DDD模型)中的模型吗?这点不违反MVVM吗?

是的,在许多情况下,这是一个更好的解决方案,特别是如果您不使用像WCF这样的通信机制.这里没有违规,因为MVVM没有强加模型部分的特定实现.

我应该将我的实体(数据库)模型与域模型合并吗?是不是违反了DDD?

还有,是的.将实体分成两个(域实体和"持久性"实体)通常会导致过度复杂化和贫血域模型.这里有更多内容:将域模型与持久性模型分开.

总的来说,我建议你看一下这个例子.这看起来正是您所需要的:使用MVVM和DDD在WPF中编写的完全成熟的应用程序.