我已经阅读了有关贫血领域模型(Domain Model)和关注点分离的一些问题。在贫血 Realm 对象上执行/附加 Realm 逻辑的最佳技术是什么?在我的工作中,我们有一个非常贫乏的模型,并且当前正在使用“帮助器”类对域对象执行数据库/业务逻辑。例如:

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)之类的方法,这也是有意义的,但这会将域逻辑放在实体上。

这是我遇到的一些技巧,不确定哪些是好/坏:
  • 客户和产品继承自“实体”类,该类以通用方式(可能使用ORM)提供了基本的CRUD操作。
  • 优点:每个数据对象将自动获得CRUD操作,但随后绑定(bind)到数据库/ ORM
  • 缺点:这不能解决在对象上进行业务操作的问题,并且还将所有域对象与可能不适合
  • 的基本实体相关联
  • 使用帮助程序类来处理CRUD操作和业务逻辑
  • 为“纯数据库”操作使用DAO,为更特定于业务的操作使用单独的业务助手是否有意义?
  • 为此使用非静态或静态助手类更好吗?
  • 优点:域对象不绑定(bind)任何数据库/业务逻辑(完全贫乏)
  • 缺点:不太面向对象,在应用程序代码(看起来像C代码)中使用助手不是很自然
  • 使用双分派(dispatch)技术,其中实体具有可保存到任意存储库的方法
  • 优点:更好的关注点分离
  • 缺点:实体附加了一些额外的逻辑(尽管它们是分离的)
  • 在C#3.0中,您可以使用扩展方法将CRUD /业务方法附加到域对象,而无需触摸它
  • 这是有效的方法吗?优点/缺点是什么?
  • 其他技术?

  • 处理此问题的最佳技术是什么?我对DDD相当陌生(我正在阅读Evans书-也许那会让我大开眼界)

    最佳答案

    Martin Fowler写了很多关于域模型的文章,包括anemic domain models。他还简要描述了域模型和数据库的许多设计模式(以及UML类图),这些模式可能会有所帮助:Catalog of "Patterns of Enterprise Application Architecture"

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

    Activity 记录会将助手的域逻辑和数据库代码移到其他域对象(如Entity基类)中。数据映射器会将助手的域逻辑移动到域对象中,而数据库代码将移动到单独的映射对象中。这两种方法都比过程样式的帮助程序类更面向对象。

    埃里克·埃文斯(Eric Evans)的“域驱动设计”书非常出色。它有点干,但是绝对值得。 InfoQ有一个"Domain Driven Design Quickly" mini-book,这是对Evans的书的很好的介绍。另外,“快速域驱动设计”可作为免费PDF获得。

    关于domain-driven-design - 贫血领域模型的处理技术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/609499/

    10-13 09:26