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个类的简单场景:
Presentation.WpfClient.View.PersonViewPresentation.WpfClient.ViewModel.PersonViewModelPresentation.WpfClient.Model.PersonModelApplication.ApplicationServices.PersonServiceDomain.Application.Services.PersonServiceDomain.Application.Models.PersonDomain.Application.DbEntities.PersonEntity (我创建这个的原因是我不能使用复杂域对象的映射,所以我只是在这里放一些数据注释而不是映射域对象)这感觉非常尴尬.我不确定如何重新构建它并使域驱动设计和MVVM模式受益.我真的被卡住了,我真的很期待任何建议或现实生活中的例子来应用MVVM和域驱动设计.我也愿意接受有关命名约定或策略的任何反馈,以便为简单操作减少这么多工作.
我仍然有两个具体的问题:
我应该从表示层(MVVM模型)中删除模型并仅使用域层(DDD模型)中的模型吗?这点不违反MVVM吗?
我应该将我的实体(数据库)模型与域模型合并吗?是不是违反了DDD?
更新
我做出的决定:
PersonModel)PersonEntity添加的PersonMappings).使用持久性模型比简单地映射它要昂贵得多.请参阅:http://enterprisecraftsmanship.com/2016/04/05/having-the-domain-model-separate-from-the-persistence-model/来自Vladimir的回答.最后它看起来像这样:
Presentation.WpfClient.View.PersonViewPresentation.WpfClient.ViewModel.PersonViewModelApplication.ApplicationServices.PersonService (与一些应用程序相关的逻辑)Application.ApplicationServices.Mappings (我在这里有存储库抽象和映射)Domain.Application.People.Person (人物对象在它的有界上下文中,对象足够智能来处理域逻辑)Vla*_*mir 11
对于单个概念来说,这是太多的类.
我应该从表示层(MVVM模型)中删除模型并仅使用域层(DDD模型)中的模型吗?这点不违反MVVM吗?
是的,在许多情况下,这是一个更好的解决方案,特别是如果您不使用像WCF这样的通信机制.这里没有违规,因为MVVM没有强加模型部分的特定实现.
我应该将我的实体(数据库)模型与域模型合并吗?是不是违反了DDD?
还有,是的.将实体分成两个(域实体和"持久性"实体)通常会导致过度复杂化和贫血域模型.这里有更多内容:将域模型与持久性模型分开.
总的来说,我建议你看一下这个例子.这看起来正是您所需要的:使用MVVM和DDD在WPF中编写的完全成熟的应用程序.
| 归档时间: |
|
| 查看次数: |
4253 次 |
| 最近记录: |