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_vcoderefUi_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 策略是一个不错的选择,因为 :-

    1. 它将遵守关注点分离 (SoC) 设计原则,即您的存储库层将使用 DTO 处理域对象和服务层。
    2. 保持代码单元可测试,以便您可以发现它是否在存储库或服务层中断。
  • 如果您使用存储库域对象 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。