Web API-从存储库层返回复杂的域对象

时间:2018-10-29 20:03:12

标签: c# asp.net-web-api repository-pattern

我正在研究一个尚处于初始阶段的项目,因此我可以在此时进行一些体系结构更改。这更多是与设计有关的问题。所以这里是:

我正在构建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;}
}

问题:

  • 我不确定我的资源库-域对象返回策略从长远来看是否是一个好选择。如果那是我应该走的路? (同一实体对象的多个实例,或者只是返回所需的属性)
  • 如果我在域对象中返回必需的属性,那不是DTO结构吗?
  • 如果我的两种方法都不正确,有人可以用合适的例子指导我吗?

还是谢谢!

1 个答案:

答案 0 :(得分:2)

  • 我认为存储库域对象返回策略是一个不错的选择,因为:-

    1. 它将遵循关注点分离(SoC)设计原则,即您的存储库层将使用DTO处理域对象和服务层。
    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。