我正在研究一个尚处于初始阶段的项目,因此我可以在此时进行一些体系结构更改。这更多是与设计有关的问题。所以这里是:
我正在构建Web API + EF + .net框架+存储库模式。
所以我有一个存储库层,它从数据库上下文返回数据。以下是存储库层中linq的代码段:
from custVerExt in _context.VERIFICATIONEXTs.Where(x => x.ID == custVer.ID).DefaultIfEmpty()
from zref_vcode in _context.LISTDATAs.Where(x => x.ID == custVerExt.VERIFICATIONCD).DefaultIfEmpty()
from refUi_vcode in _context.LBLTXTs.Where(x => x.ID == zref_vcode.REFLISTDATANMLBLID).DefaultIfEmpty()
from zref_tcode in _context.LISTDATAs.Where(x => x.ID == custVerExt.TYPEID).DefaultIfEmpty()
from refUi_tcode in _context.LBLTXTs.Where(x => x.ID == zref_tcode.REFLISTDATANMLBLID).DefaultIfEmpty()
现在,我要同时返回refUi_vcode
类型的对象refUi_tcode
和_context.LBLTXTs
。
类似select refUi_vcode.name,refUi_tcode.name
我不希望我的存储库返回DTO(它是我的服务层的工作),因此我想返回一些客户域对象。 现在,我为域对象提出了两种结构。在上面列出的情况下,如果我想两次从同一个表返回值,则可以创建同一对象的两个实例 OR ,或者从这两个对象创建两个单独的属性。
代码示例:
public class CustDomainObj
{
public LBLTXTs obj1 {get;set;}
public LBLTXTs obj2 {get;set;}
}
//OR
public class CustDomainObj
{
public string obj1 {get;set;}
public string obj2 {get;set;}
}
我的DTO如下:
public CustDTO
{
public string vname{get;set;}
public string cname{get;set;}
}
问题:
还是谢谢!
答案 0 :(得分:2)
我认为存储库域对象返回策略是一个不错的选择,因为:-
如果使用存储库域对象返回策略,则最好只返回必需的属性,因为不需要Entity的其他属性,这样会减少冗余。
对于第二个问题,DTO和域对象之间是有区别的。 DTO可能包含不同层上所需的信息。假设您的服务层需要返回客户的地址详细信息和工作详细信息(均为域对象)。那么DTO看起来像这样:-
DTO:-
public class CustDTO
{
public string address1{get;set;}
public string address2{get;set;}
public string company{get;set;}
public string location{get;set;}
}
域对象:-
public class CustAddress
{
public string address1{get;set;}
public string address2{get;set;}
}
public class CustWorkDetials
{
public string company{get;set;}
public string location{get;set;}
}
因此,当您想将给定层的两个或更多类的单个聚合类作为返回值传递到堆栈中其上一层时,基本上使用DTO。