DDD“查看对象”?

鉴于涉及公司的申请涉及公司,我可能会有公司类。 我将有一个填充List 的数据访问层。 但是,有时候(例如显示搜索结果)我只需要显示公司名称,电话和邮政编码属性,在我看来,填充整个Company对象及其所有属性似乎都是浪费。

在DDD设计方面,采用这种方法的正确方法是什么? 我是否会创建View特定的类,例如一个只暴露我感兴趣的属性的CompanySearchResult对象?

这听起来像是一种合理的方法。

稍后,如果客户来找你,要求你的SearchResult显示与Company模型无关的东西 – 像附近冰淇淋店的数量一样疯狂,你将更容易将其附加到你的CompanySearchResult不是你的域对象。

这通常被称为“视图模型”或数据传输对象。 您可能不希望您的视图访问您的域模型公开的整个数据树。 特别是如果暴露您的域模型意味着您的视图必须深入挖掘您的对象图以提取它所需的数据,View Model可以很有意义地简化模型对象的使用。 在您的情况下,如果您只是从模型对象中提取直接属性,那么如果您想要隐藏其他域模型不需要的无关数据,则会有意义。

您建议的方法可以快速增加您需要创建的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() order by c.Name select new CompanyNameLookup { ID = c.ID, Name = c.Name } ).ToList(); 

或者用于danymicly创建的类型:

 var companies = (from c in db.Table() order by c.Name select DynamicTypeFactory.New( c.Id ).And( c.Name ).Create() ).ToList(); 

DynamicTypeFactory是具有静态方法的类,在运行时为danymic创建类提供了New和流畅的接口。