【发布时间】:2010-12-21 23:55:38
【问题描述】:
给定一个涉及公司的应用程序,我可能有一个公司类。我将有一个填充列表
就 DDD 设计而言,解决此问题的正确方法是什么?我是否会创建 View 特定类,例如仅公开我有兴趣显示的属性的 CompanySearchResult 对象?
【问题讨论】:
给定一个涉及公司的应用程序,我可能有一个公司类。我将有一个填充列表
就 DDD 设计而言,解决此问题的正确方法是什么?我是否会创建 View 特定类,例如仅公开我有兴趣显示的属性的 CompanySearchResult 对象?
【问题讨论】:
这听起来对我来说是一个合理的方法。
稍后,如果客户来找您,要求您的 SearchResult 显示与 Company 模型无关的东西 - 像附近冰淇淋店的数量这样疯狂的东西,您将更容易将其附加到您的 CompanySearchResult 比您的域对象。
【讨论】:
这就是通常所说的“视图模型”或数据传输对象。您可能不希望您的视图有权访问您的域模型公开的整个数据树。尤其是如果公开你的领域模型意味着你的视图将不得不深入挖掘你的对象图来提取它需要的数据,那么视图模型对于简化模型对象的工作非常有意义。在您的情况下,如果您只是从模型对象中提取直接属性,那么如果您想隐藏域模型的其余部分不需要的无关数据,那将是有意义的。
【讨论】:
您建议的方法可以快速增加您需要创建的 DAO 数量,并成为维护的噩梦。几个 ORM 采取的方法是代理数据访问,因此您的数据访问层将返回一个接口列表,并且数据库调用将被推迟到您调用数据访问器时,例如
list.getCompany(1).getName()
。这称为延迟加载。您仍然需要在进行许多小的或更少的大查询之间进行权衡。这种类型的任务是 ORM 的优势之一,您通常可以要求您的 ORM 预取您认为将使用的对象图的部分,而忽略其他部分。
【讨论】:
我使用了实体属性的崩溃。例如:
// interface for "ID" attribute of Company entity
public interface ICompany_ID {
Guid CompanyID{get;set;}
}
// interface for "Name" attribute of Company entity
public interace ICompany_Name {
string Name{get;set;}
}
// interface for "Logo" attribute of Company entity
public interface ICompany_Logo {
byte[] Logo{get;set;}
}
// interface for all attributes of Company entity
public interface ICompany : ICompany_ID, ICompany_Name, ICompany_Logo { }
// base class for classes based on Company entity
public abstract class CompanyBase : ICompany_ID {
// implementation of ICompany_ID interface
}
// class for all attributes of Company entity
public class Company : ICompany {
// implementation of ICompany interface (all attributes)
}
// class for Company name lookup
public class CompanyNameLookup : CompanyBase, ICompany_Name {
// implementation of ICompany_Name interfade
}
这个崩溃让我可以处理不同实体的不同属性,而且都是类型安全的。 但是,您的数据层必须支持这种情况。
下一种方法是动态创建查找类,但要复杂得多。另一方面,它更加灵活。
编辑: 那么选择可以是例如:
var companies = (from c in db.Table<ICompany>()
order by c.Name
select new CompanyNameLookup { ID = c.ID, Name = c.Name }
).ToList();
或者对于动态创建的类型:
var companies = (from c in db.Table<ICompany>()
order by c.Name
select DynamicTypeFactory.New<ICompany_ID>( c.Id ).And<ICompany_Name>( c.Name ).Create()
).ToList();
DynamicTypeFactory 是具有静态方法 New 的类和在运行时用于动态创建类的流畅接口。
【讨论】: