DDD“查看对象”?

时间:2009-12-01 12:02:22

标签: c# domain-driven-design

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

在DDD设计方面,采用这种方法的正确方法是什么?我是否会创建View特定的类,例如CompanySearchResult对象,它只公开我有兴趣显示的属性?

4 个答案:

答案 0 :(得分:4)

这对我来说听起来很合理。

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

答案 1 :(得分:4)

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

答案 2 :(得分:1)

您建议的方法可以快速增加您需要创建的DAO数量并成为维护噩梦。几个ORM采用的方法是代理数据访问,因此您的数据访问层将返回一个接口列表,数据库调用将被推迟,直到您调用数据访问器为止,例如

list.getCompany(1).getName()

。这是调用延迟加载。您仍然需要在制作许多较小或较少的大查询之间进行权衡。这种类型的任务是ORM的优势之一,您通常可以要求您的ORM预取您认为将使用的对象图的部分,并省略其他部分。

答案 3 :(得分:0)

我使用了一个实体属性的崩溃。例如:

// 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();

或用于danymicly创建的类型:

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的类,并且在运行时为danymic创建类提供了流畅的接口。