C# 什么';从数据访问层加载对象图的推荐方法是什么?

C# 什么';从数据访问层加载对象图的推荐方法是什么?,c#,architecture,domain-driven-design,data-access-layer,software-design,C#,Architecture,Domain Driven Design,Data Access Layer,Software Design,来自一本相对较旧的软件体系结构书籍: 在其他情况下,相同的概念是“获取订单”查询 可能会生成不同的数据,例如,订单集合 对象加上订单项信息。你该怎么办?你应该 公开两个稍微不同的GetOrders方法 达尔?如果根据用户界面,用户可能会问 按国家/地区返回订单、订单项和产品的系统? 您会在DAL中定义另一个类似的方法吗 作者建议使用查询对象模式。我能想到的其他方法: 1) 每个关系/子集合的可选参数: IOrder GetOrder(int id, bool withItems = false)

来自一本相对较旧的软件体系结构书籍:

在其他情况下,相同的概念是“获取订单”查询 可能会生成不同的数据,例如,订单集合 对象加上订单项信息。你该怎么办?你应该 公开两个稍微不同的GetOrders方法 达尔?如果根据用户界面,用户可能会问 按国家/地区返回订单、订单项和产品的系统? 您会在DAL中定义另一个类似的方法吗

作者建议使用查询对象模式。我能想到的其他方法:

1) 每个关系/子集合的可选参数:

IOrder GetOrder(int id, bool withItems = false);  
2) 元组

从IOrder定义中删除IList并返回元组

Tuple<IOrder, IList<IOrderItems>> GetOrderWithItems(int id);  
4) 分开的方法

DAL不应该处理这个问题。检索订单及其项目应分两步进行:

IOrder myOder = GetOrder(myOrderId);
myOrder.items = GetOrderItems(myOrderId);    
最好的办法是什么?我关心的另一个问题是空引用。当items=null时,DAL客户端可能会将其与0混淆(订单中没有项目)。如何应对

-惯例

null=未加载/设置

空集合=0项

-包装纸

ItemsWrapper为空:未加载项

ItemsWrapper.items为null或(空):0项

-泛型(这可能很愚蠢)

接口IOR,其中TVoidableItems:i无项目
{
int-id;
tvoidable项目;
}
接口IWithoutItems{}
接口IWithItems:IWithoutItems{IList value;}

如果第二个问题与主题无关,请让我知道,我将把它转移到第二个主题。我相信这是相关的。也许我不应该首先为DAL使用域对象,而应该使用简单的无关系类型?

作者似乎认为有一条从DB直接到UI的快速通道

在经典的领域驱动设计中,它并没有那么简单,至少有领域层,可能还有两个其他层。在域模型中,
顺序
将(可能)有一个
项列表
,形成一个聚合,但您将从中生成额外的DTO/viewmodels/任何东西,以获得可在UI中显示的内容


在DDD+CQRS上下文中,在读取端,数据库数据和表示就绪数据之间的关联更快。我会根据视图定制我的数据结构,这可能意味着两种读取模型:
OrderWithItems
Order
作者(Dino Esposito)所缺少的是对带来的关注的清晰分离。如果我没有弄错的话,他的书中完全没有这种模式。他在书中解释道,我认为他在写这本书的时候没有那么丰富的经验。不幸的是,本文仍然遗漏了一些使查询对象真正强大的基本抽象。另一方面,我们将更详细地介绍如何更有效地为应用程序建模。

这似乎有点基于观点,因此我将给出我的看法。您可以看一看,这本书是由大多数ORM提供的,这本书是哪本旧的软件体系结构书?@MarkSeemann“为企业设计Microsoft®.NET解决方案”。第6章-数据访问层。有第二版,但更像是第二卷,我还没有读过。@Cortez9我还没有读过,所以如果不理解作者写这本书的原因和制约因素,很难回答这个问题。在这个空间中,任何合理的答案都必须从它开始,但因为我不知道它取决于什么,所以我不能回答。
IOrder myOder = GetOrder(myOrderId);
myOrder.items = GetOrderItems(myOrderId);    
interface IOrder<TVoidableItems> where TVoidableItems : IWithoutItems
{
int id;
TVoidableItems items;
}


interface IWithoutItems{}

interface IWithItems: IWithoutItems { IList<IOrderItems> value;}