【问题标题】:Bads of rich domain model富域模型的缺点
【发布时间】:2012-11-17 18:18:26
【问题描述】:

我正在阅读有关贫血的域模型是一种反模式的内容,我对此有一些疑问。 我有一个数据库,其中三个客户使用,每个客户都有不同的业务规则来将产品插入数据库。 因此,如果我使用富域模型,我的代码将是这样的:

public class Product: IValidatableObject
{
     public int Id;
     public Client Client;
     public int ClientId;

     public IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
     {
          if (ClientId == 1)
               DoValidationForClientOne();
          else if (ClientId == 2)
               DoValidationForClientTwo();
          else if (ClientId == 3)
               DoValidationForClientThree();
     }
}

嗯,这很可怕,不是吗? 现在,如果我有一个贫乏的领域模型,我可以简单地创建三个服务层类,其中每个类都包含对一个特定客户端的验证。不好吗?

我的第二个论点是:如果我有一个桌面和一个使用相同富域模型的 Web 应用程序,我怎么知道何时抛出 HttpException 以及何时抛出一些桌面异常?分开不是更好吗? 那么,最后,为什么在我的项目中这种情况下,贫血的领域模型是一种反模式?

【问题讨论】:

标签: domain-driven-design design-patterns


【解决方案1】:

我会推荐以下:

  • 定义IProductValidator接口,并提供3个实现为:

    interface IProductValidator {
        void validateProduct(Product product);
    }
    
  • 更改Client 类,并为其添加以下方法

    class Client {
        void validateProduct(Product product) {
            getProductValidator().validate(product);
        }
    
        IProductValidator getProductValidator() {
           // this method returns validator, and it's better the method 
           // be abstract, and be implemented in sub-classes according 
           // to their type
        }
    
    }
    
  • 并将Product 类更改为:

    public class Product: IValidatableObject {
        public int Id;
        public Client client;
    
        public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
            client.validate(this);
        }
    }
    

现在去

【讨论】:

    【解决方案2】:
    1. 如前所述 - 您只显示了 DTO,而不是域实体。
    2. 在 DDD 中,您将在 Product 实体中直接使用一些常量规则和一些 ProductPolicies 来封装在不同上下文中处理产品时可能不同的内容。可怕?不。美丽而强大。但前提是您的域足够复杂。如果不是,请使用贫血模型。
    3. 您的域不应依赖于任何东西。不应该对 Web 平台、桌面平台、正在使用的 ORM、正在使用的 DI 容器一无所知。所以如果抛出异常,应该是域自定义异常。阅读洋葱架构或六边形架构以获得更详细的解释:http://jeffreypalermo.com/blog/the-onion-architecture-part-1/

    【讨论】:

      【解决方案3】:

      AnaemicDomainModel 占有一席之地:https://softwareengineering.stackexchange.com/questions/160782/are-factors-such-as-intellisense-support-and-strong-typing-enough-to-justify-the

      您的域模型不应抛出特定于演示平台的异常。让您的演示文稿代码解决这个问题。你的目标应该是让你的领域模型不知道它的表现。

      【讨论】:

        猜你喜欢
        • 2012-12-31
        • 2010-09-27
        • 1970-01-01
        • 2014-06-12
        • 2014-01-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-03
        相关资源
        最近更新 更多