当前位置:  开发笔记 > 编程语言 > 正文

处理贫血域模型的技术

如何解决《处理贫血域模型的技术》经验,为你挑选了2个好方法。

我已经阅读了一些有关贫血领域模型和关注点分离的问题.在贫血域对象上执行/附加域逻辑的最佳技术是什么?在我的工作中,我们有一个非常贫穷的模型,我们目前正在使用"帮助程序"类来执行域对象上的数据库/业务逻辑.例如:

public class Customer
{
    public string Name {get;set;}
    public string Address {get;set;}
}

public class Product
{
    public string Name {get;set;}
    public decimal Price {get;set;}
}

public class StoreHelper
{
    public void PurchaseProduct(Customer c, Product p)
    {
         // Lookup Customer and Product in db
         // Create records for purchase
         // etc.
    }
}

当应用程序需要购买时,它将创建StoreHelper,并在域对象上调用该方法.对我而言,客户/产品知道如何将自己保存到存储库是有意义的,但您可能不希望在域对象上使用Save()方法.对于像Customer.Purchase(Product)这样的方法也有意义,但这就是将域逻辑放在实体上.

以下是我遇到的一些技巧,不确定哪些是好/坏:

    Customer和Product继承自"Entity"类,它以通用方式提供基本的CRUD操作(可能使用ORM).

    优点:每个数据对象将自动获得CRUD操作,但随后绑定到数据库/ ORM

    缺点:这不能解决对象上的业务操作问题,并且还将所有域对象绑定到可能不合适的基本实体

    使用帮助程序类来处理CRUD操作和业务逻辑

    将DAO用于"纯数据库"操作是否有意义,并为更具体业务的操作分离业务助手?

    为此使用非静态或静态辅助类更好吗?

    优点:域对象不依赖于任何数据库/业务逻辑(完全贫血)

    缺点:不是非常OO,在应用程序代码中使用帮助器不太自然(看起来像C代码)

    使用Double Dispatch技术,其中实体具有保存到任意存储库的方法

    优点:更好地分离关注点

    缺点:实体附加了一些额外的逻辑(虽然它是分离的)

    在C#3.0中,您可以使用扩展方法将CRUD /业务方法附加到域对象而不触及它

    这是一种有效的方法吗?什么是利弊?

    其他技术?

处理此问题的最佳技巧是什么?我对DDD很新(我正在阅读埃文斯的书 - 所以也许这会打开我的眼睛)



1> Arnis Lapsa..:

为了避免贫血模型,重构您的助手类:

逻辑如:
"Customer.PurchaseProduct(产品,付款支付)",
"Customer.KillCustomer(人员杀手,武器武器)"
应存在于"客户"域对象中.

逻辑如:
"Customer.IsCustomerAlive()"
"Customer.IsCustomerHappy()"
应该符合规范.

逻辑如:
"Customer.Create()",
"Customer.Update()"
显然应该转到存储库.

逻辑如:
"Customer.SerializeInXml()"
"Customer.GetSerializedCustomerSizeInBytes()"
应该转到服务.

复杂的构造者应该去工厂.

这就是我看到它的方式.如果有人能评论我对DDD方法的理解,我会很高兴.


编辑:

有时 - 不应该避免贫血领域模型.

编辑我的答案补充说DDD不是关于拾取和丢弃模式.
DDD是我们思考的方式.



2> Chris Peters..:

Martin Fowler撰写了很多关于领域模型的文章,包括贫血领域模型.他还为可能有用的域模型和数据库提供了许多设计模式的简要描述(和UML类图):"企业应用程序架构模式"目录.

我建议查看Active Record和Data Mapper模式.从您的问题描述中,听起来您的帮助程序类包含域/业务规则数据库实现细节.

Active Record会将帮助程序的域逻辑和数据库代码移动到其他域对象(如Entity基类).Data Mapper会将帮助程序的域逻辑移动到域对象中,将数据库代码移动到单独的映射对象中.任何一种方法都比面向过程的助手类更加面向对象.

Eric Evans的"领域驱动设计"一书非常出色.它有点干,但绝对值得.InfoQ有一本"快速领域驱动设计"迷你书,是对埃文斯书籍的一个很好的介绍.加上"快速领域驱动设计"作为免费PDF提供.

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有