如何在域驱动设计中为域模型编写域逻辑?

时间:2014-04-01 14:08:41

标签: c# domain-driven-design asp.net-mvc-5

我坚持为域模型编写域逻辑。

我是DDD的新手,已阅读过DDD的一些文章。我已经为我们的项目收集了一些域对象,但我无法弄清楚域逻辑是什么意思?

我有一个名为&#34的域模型类;帐户"。

当用户注册新帐户时,他们必须在我们的项目中选择两种类型的帐户之一。

我们假设一个帐户类型是个人帐户,另一个帐户类型是商家。

帐户模型类如下所示:

public class Account
    {
            private AccountType _accountType;
            private string _userRole;
            private Address _address;
            private BusinessInfo _businessInfo;
            private string _contactPhoneNumber;
            private string _citizenshipCountryCode;
            private DateTime _dateOfBirth;
            private string _emailAddress;
            private string _preferredLanguage;
            private string _registrationType;
            private DateTime _createdDateTime;
    }

我没有发布我的全班,但上面是帐户域的属性。

如果用户选择了商家帐户,则必须填写商家信息详细信息,否则不需要。

根据我的情况,我如何选择帐户域类的域逻辑。

有哪些想法或我应该如何选择域逻辑?

任何帮助都会很明显。

4 个答案:

答案 0 :(得分:2)

2我听起来好像你有不同类型的帐户,它们都有一些共同的部分,但也有一些特定于每种类型的部分。

您是否考虑过使用常用内容创建基本帐户类,并创建从此基类继承的特定帐户类型?

基类可以在其构造函数中将所有必要的信息作为参数 并揭露常见的操作..

同样,专门的类(BusinessAccount?)可以在常见的东西之上采取任何必要的东西作为构造函数中的参数。

答案 1 :(得分:1)

  

但我无法弄清楚域逻辑是什么意思?

与你正在处理的问题直接相关的一切。有问题我的意思是客户谈论的部分问题。

技术性的事情,例如'如何显示此帐户?'或者'如何从数据库中检索帐户数据?'应该与域名逻辑分开,例如“此帐户是否已过期?','此帐户是否具有特殊权限?','当我们关闭帐户时发生的事情& #39;等

编写域逻辑的最难的部分是找到如何解耦这个技术部分的方法,这对您的客户来说没有比MAGIC更有意义。从某种意义上说 - 它毕竟只是一个模型,你需要一些方法来反映它(例如编程语言本身)。

你最终应该得到的是整齐的书写规则集,它严格遵循客户所说的语言。

答案 2 :(得分:1)

  

根据我的情况,我如何选择帐户的域逻辑   域类。

     

有哪些想法或我应该如何选择域逻辑?

我的一般规则:

与软件的目标域相关的所有内容并且不是基础结构(数据访问或应用程序层)或GUI(表示层)可以被视为域逻辑。< / strong>

域逻辑可以放入实体,值对象,聚合,域服务,域事件,工厂。

根据Domain-Driven Design by Eric Evans,有building blocks of DDD

  1. 分层架构。它用于将域模型和域逻辑与持久层和表示层隔离
  2. 实体(实现域逻辑的域模型的构建块)
  3. 值对象(实现域逻辑的域模型的构建块)
  4. 域事件(通知时由'专家'执行的域逻辑)
  5. 服务(不对任何实体负责的域逻辑)
  6. 模块
  7. 聚合(实现域逻辑的域模型的构建块)
  8. 存储库。它们提供了内存集合的幻觉。
  9. 工厂。负责创建复杂对象实例的域逻辑。
  10. 所以,我会按照以下方式设计它:

    • Account是一个抽象类,PersonalAccountBusinessAccount类继承它。

    • AccountFactory用于创建复杂对象(PersonalAccountBusinessAccount)。

    • 用户界面或应用程序逻辑使用AccountFactory使用用户提供的数据创建Account

    • 您还可以为业务用户更自然地在Account的订单组属性中引入其他值对象,并使用ubiquitous language

答案 3 :(得分:0)

基本上,您需要一个AccountingProcessingRules类,它接受不同类型的Account类并相应地处理。执行此操作时,您可以为每种帐户类型指定两组规则,一组用于个人,一组用于业务。