gpt4 book ai didi

wpf - 在WPF应用程序中使用MVVM和DDD,而没有太多的类

转载 作者:行者123 更新时间:2023-12-03 14:13:54 27 4
gpt4 key购买 nike

我有一个WPF应用程序,我想将MVVM用于表示层,将DDD应用到整个应用程序。我对如何应用体系结构感到非常困惑。您能给我一些建议吗,感觉到我现在已经完全搞砸了以下设计尝试:

我有4层:

  • Presentation Layer :这是我的WPF客户端应用程序所在的位置。
  • Application Layer :这是我的服务,应该与域服务进行业务规则通信并进行CRUD。它只是 Presentation Domain 层之间的反腐败层而已。
  • Domain Layer :这是我的聚合,域对象和一些揭示业务规则的服务的地方,例如IsTooOld(Person person)
  • Infrastructure Layer :这是最低层,基础结构位于此处,IRepositoryIEntity等。.

  • 让我们用基于DDD的图层实现一个简单的方案:在数据库中拥有一个Person对象,对其进行映射,对数据库进行CRUD,检查人员的生日并将其显示给用户。

    表示层

    我将从WPF部分开始。我创建以下类:
  • PersonView :人员
  • 的XAML View
  • PersonViewModel :为ViewModel提供功能的PersonViewPersonView绑定(bind)到此,此ViewModel提供PersonModel的值
  • PersonModel :这是我的PersonViewModel与之紧密耦合的MVVM模型。


  • 域层

    这对于表示层已经足够了。我现在想连接到数据库以检索人员对象以显示它。

    我必须创建:
    PersonEntity中的
  • Domain Layer :数据库实体的聚合,用于与数据库进行映射。它位于Domain层。
  • Person中的
  • Domain Layer :这是DDD的域模型。我将在此处添加一些逻辑,并且我不想像DDD所建议的那样发送实体对象。


  • 应用层

    好的,我已经有3个人模型,彼此非常相似。关于数据访问和服务的更多信息呢?
    PersonService中的
  • Application Layer :当我的表示层要与该层通信时,需要将其PersonModel(MVVM模型)转换为Person(域模型)。然后,应用程序层中的此服务将其Person(域模型)转换为PersonEntity(实体对象),并对数据库进行CRUD。此服务还使用域层中的另一个PersonService(请参见下文)来检查/应用一些业务规则。
  • PersonService中的
  • Domain Layer :此层仅适用于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示例。这看起来完全符合您的需求:使用WVM并使用MVVM和DDD编写的成熟应用程序。

    关于wpf - 在WPF应用程序中使用MVVM和DDD,而没有太多的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38431091/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com