当前位置: 首页 > 编程语言 > C#

DDD“查看对象”?分享

时间:2023-04-10 20:15:57 C#

DDD“查看对象”?鉴于涉及公司的应用程序涉及公司,我可能会有一个公司类。我将有一个填充列表的数据访问层。然而,有时(例如显示搜索结果)我只需要显示公司名称、电话和邮政编码属性,而用它的所有属性填充整个Company对象对我来说似乎是一种浪费。在DDD设计方面,处理这个问题的正确方法是什么?我是否会创建特定于视图的类,例如只公开我感兴趣的属性的CompanySearchResult对象?这听起来像是一个合理的方法。稍后,如果客户来找您并要求您的SearchResult显示与Company模型无关的内容-例如附近冰淇淋店的数量是疯狂的,那么您将它附加到您的CompanySearchResult比你的域对象。这通常被称为“视图模型”或数据传输对象。您可能不希望您的视图访问域模型公开的整个数据树。特别是如果暴露你的领域模型意味着你的视图必须深入挖掘你的对象图来提取它需要的数据,视图模型可以非常有意义地简化模型对象的使用。在您的情况下,如果您只是从模型对象中提取直接属性,那么如果您想隐藏其他域模型不需要的无关数据,这将是有意义的。您建议的方法可以快速增加您需要创建的DAO的数量,并成为维护的噩梦。几个ORM采取的方法是代理数据访问,因此您的数据访问层将返回一个接口列表,并且数据库调用将被推迟,直到您调用数据访问器,例如列表.getCompany(1).getName()。这称为延迟加载。您仍然需要在进行许多更小或更少的大型查询之间进行权衡。这种类型的任务是ORM的优势之一,您通常可以要求ORM预取您认为它将使用的对象图的部分,并忽略其他部分。我使用了折叠的实体属性。例如://公司实体的“ID”属性的接口publicinterfaceICompany_ID{GuidCompanyID{get;set;}}//公司实体的“Name”属性的接口publicinterfaceICompany_Name{stringName{get;set;}}//公司实体publicinterfaceICompany_Logo{byte[]Logo{get;set;}}//公司实体所有属性的接口publicinterfaceICompany:ICompany_ID,ICompany_Name,ICompany_Logo{}//base基于Company实体的类的类publicabstractclassCompanyBase:ICompany_ID{//ICompany_ID接口的实现}//Company实体的所有属性的类publicclassCompany:ICompany{//ICompany接口的实现(所有属性)}//类用于公司名称查找publicclassCompanyNameLookup:CompanyBase,ICompany_Name{//ICompany_Nameinterfade的实现}这种折叠允许我使用不同实体的不同属性,并且所有属性都是类型安全的。但是,您的数据层必须支持这种情况。下一个方法是动态创建查找类,但要复杂得多。另一方面,它更灵活。编辑:所以选择可以是例如:varcompanys=(fromcindb.Table()orderbyc.NameselectnewCompanyNameLookup{ID=c.ID,Name=c.Name}).ToList();或使用动态创建的类型:varcompanies=(fromcindb.Table()orderbyc.NameselectDynamicTypeFactory.New(c.Id).And(c.Name).Create()).ToList();DynamicTypeFactory是一个具有静态方法的类,它在运行时为动态创建的类提供一个新的和流畅的接口。以上就是C#学习教程:DDD“查看对象”?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: