0

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

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 以及何时抛出一些桌面异常?分开不是更好吗?那么,最后,为什么在我的项目中这种情况下,贫血的领域模型是一种反模式?

4

3 回答 3

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

AnaemicDomainModel 有它的位置:https ://softwareengineering.stackexchange.com/questions/160782/are-factors-such-as-intellisense-support-and-strong-typing-enough-to-justify-the

您的域模型不应该抛出特定于演示平台的异常。让您的演示文稿代码解决这个问题。您的目标应该是使您的域模型与其表示无关。

于 2012-11-29T16:55:32.487 回答
0

我将推荐以下内容:

  • 定义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);
        }
    }
    

现在你

于 2014-04-15T06:43:53.207 回答