我已经阅读了有关贫血领域模型(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)之类的方法,这也是有意义的,但这会将域逻辑放在实体上。
这是我遇到的一些技巧,不确定哪些是好/坏:
处理此问题的最佳技术是什么?我对DDD相当陌生(我正在阅读Evans书-也许那会让我大开眼界)
最佳答案
Martin Fowler写了很多关于域模型的文章,包括anemic domain models。他还简要描述了域模型和数据库的许多设计模式(以及UML类图),这些模式可能会有所帮助:Catalog of "Patterns of Enterprise Application Architecture"。
我建议查看Active Record和Data Mapper模式。从对问题的描述中,听起来您的帮助程序类包含域/业务规则和数据库实现详细信息。
Activity 记录会将助手的域逻辑和数据库代码移到其他域对象(如Entity
基类)中。数据映射器会将助手的域逻辑移动到域对象中,而数据库代码将移动到单独的映射对象中。这两种方法都比过程样式的帮助程序类更面向对象。
埃里克·埃文斯(Eric Evans)的“域驱动设计”书非常出色。它有点干,但是绝对值得。 InfoQ有一个"Domain Driven Design Quickly" mini-book,这是对Evans的书的很好的介绍。另外,“快速域驱动设计”可作为免费PDF获得。
关于domain-driven-design - 贫血领域模型的处理技术,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/609499/