web api - return 来自存储库层的复杂域对象
web api - return complex domain object from repository layer
我正在从事一个目前处于初始阶段的项目,因此我可以在此时进行一些架构更改。这更多是一个与设计相关的问题。所以这里是:
我正在构建 Web API + EF + .net 框架 + 存储库模式。
所以我有一个存储库层,其中 return 来自数据库的数据 context.following 是存储库层中的 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()
现在,我希望类型 _context.LBLTXTs
的对象 refUi_vcode
和 refUi_tcode
都被 return 编辑。
类似于select refUi_vcode.name,refUi_tcode.name
我不希望我的存储库到 return DTO(这是我的服务层的工作)因此我想 return 一些客户域对象。
现在,我为我的域对象提出了两种结构。在上面列出的情况下,如果我想 return 来自同一个 table 的值两次,我可以创建同一对象的两个实例 或 创建两个单独的属性我想从这两个对象。
代码示例:
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;}
}
问题:
- 我不确定我的存储库 - 域对象 return 策略是否适合长期 运行。如果是我应该走哪条路? (同一实体对象的多个实例或只是 return 必需的属性)
- 如果我return需要域对象中的属性,那不就是一种DTO结构吗?
- 如果我的两种方法都不正确,谁能用适当的例子指导我?
总之谢谢!
我认为存储库域对象 return 策略是一个不错的选择,因为 :-
- 它将遵守关注点分离 (SoC) 设计原则,即您的存储库层将使用 DTO 处理域对象和服务层。
- 保持代码单元可测试,以便您可以发现它是否在存储库或服务层中断。
如果您使用存储库域对象 return 策略,最好仅 return 必需的属性,因为不需要实体的其他属性并且会减少冗余.
关于你的第二个问题,DTO 和域对象之间是有区别的。 DTO 可能包含不同 layers.Lets 所需的信息,比如您的服务层需要 return 客户地址详细信息和工作详细信息(两者都是域对象)。那么 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;}
}
因此,当您想将给定层的两个或多个 class 的单个聚合 class 作为 return 值传递给堆栈中其上方的层时,基本上会使用 DTO。
我正在从事一个目前处于初始阶段的项目,因此我可以在此时进行一些架构更改。这更多是一个与设计相关的问题。所以这里是:
我正在构建 Web API + EF + .net 框架 + 存储库模式。
所以我有一个存储库层,其中 return 来自数据库的数据 context.following 是存储库层中的 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()
现在,我希望类型 _context.LBLTXTs
的对象 refUi_vcode
和 refUi_tcode
都被 return 编辑。
类似于select refUi_vcode.name,refUi_tcode.name
我不希望我的存储库到 return DTO(这是我的服务层的工作)因此我想 return 一些客户域对象。 现在,我为我的域对象提出了两种结构。在上面列出的情况下,如果我想 return 来自同一个 table 的值两次,我可以创建同一对象的两个实例 或 创建两个单独的属性我想从这两个对象。
代码示例:
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;}
}
问题:
- 我不确定我的存储库 - 域对象 return 策略是否适合长期 运行。如果是我应该走哪条路? (同一实体对象的多个实例或只是 return 必需的属性)
- 如果我return需要域对象中的属性,那不就是一种DTO结构吗?
- 如果我的两种方法都不正确,谁能用适当的例子指导我?
总之谢谢!
我认为存储库域对象 return 策略是一个不错的选择,因为 :-
- 它将遵守关注点分离 (SoC) 设计原则,即您的存储库层将使用 DTO 处理域对象和服务层。
- 保持代码单元可测试,以便您可以发现它是否在存储库或服务层中断。
如果您使用存储库域对象 return 策略,最好仅 return 必需的属性,因为不需要实体的其他属性并且会减少冗余.
关于你的第二个问题,DTO 和域对象之间是有区别的。 DTO 可能包含不同 layers.Lets 所需的信息,比如您的服务层需要 return 客户地址详细信息和工作详细信息(两者都是域对象)。那么 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;}
}
因此,当您想将给定层的两个或多个 class 的单个聚合 class 作为 return 值传递给堆栈中其上方的层时,基本上会使用 DTO。