【问题标题】:What's the recommended way to load an object graph from Data Access Layer?从数据访问层加载对象图的推荐方法是什么?
【发布时间】:2015-08-19 04:51:45
【问题描述】:

来自一本相对较旧的软件架构书:

在其他情况下,相同的概念 Get-Orders 查询 可能会生成不同的数据——例如,Order 的集合 对象加上订单项目信息。你该怎么办?你应该 公开两个略有不同的 GetOrders 方法 达尔?如果根据用户界面,用户可能会问 按国家/地区退回订单、订购商品和产品的系统? 你会在 DAL 中定义另一个相似的方法吗?

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

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

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

2) 元组

从 IOrder 定义中移除 IList 并返回一个元组

Tuple<IOrder, IList<IOrderItems>> GetOrderWithItems(int id);  

3) 方法重载

IOrder GetOrder(int id);
IOrder GetOrderWithItems(int id);  

4) 分离方法

DAL 不应该处理这个问题。检索带有商品的订单应分两步完成:

IOrder myOder = GetOrder(myOrderId);
myOrder.items = GetOrderItems(myOrderId);    

最好的方法是什么?我担心的另一个问题是空引用。当 items = null 时,DAL 客户端可能会将其混淆为 0(订单没有项目)。如何处理?

-约定

null = 未加载/设置

空集合 = 0 项

-包装器

ItemsWrapper 为空:项目未加载

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

-泛型(这可能很愚蠢)

interface IOrder<TVoidableItems> where TVoidableItems : IWithoutItems
{
int id;
TVoidableItems items;
}


interface IWithoutItems{}

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

如果第二个问题离题,请告诉我,我会将其移至第二个线程。我相信这是相关的。也许我一开始就不应该对 DAL 使用域对象,而是使用简单的无关系类型?

【问题讨论】:

  • 这似乎有点基于意见,所以我会给出我的。你可以看看lazy loading,这是大多数ORM提供的
  • 那是哪本旧的软件架构书
  • @MarkSeemann “为企业构建 Microsoft® .NE​​T 解决方案”。第 6 章 - 数据访问层。有第二版,但更像是第二卷,我还没有读过。
  • @Cortez9 我还没读过它,所以如果不理解导致作者写这篇文章的力量和约束,很难回答。在这个空间中任何合理的答案都必须以it取决于开头,但由于我不知道它取决于什么,我无法回答。

标签: c# architecture domain-driven-design data-access-layer software-design


【解决方案1】:

作者(Dino Esposito)在his book 中缺少的是CQRS 带来的关注点的明确分离。如果我没记错的话,他的书中完全没有这种模式。在Esposito's latest MSDN article 中,他解释了 CQRS,所以我认为他在写那本书时并没有那么有经验。不幸的是,这篇文章仍然遗漏了一些使查询对象真正强大的基本抽象。另一方面,This article 更详细地介绍了如何更有效地为您的应用程序建模。

【讨论】:

    【解决方案2】:

    似乎作者假设从 DB 直接到 UI 有一条快速通道。

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

    在 DDD+CQRS 上下文中,数据库数据和读取端的呈现就绪数据之间的对应关系更快。我会根据视图定制我的数据结构,这可能意味着两个读取模型:OrderWithItemsOrder

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-31
      • 2011-01-09
      • 1970-01-01
      • 2019-05-09
      • 1970-01-01
      • 2010-11-14
      • 2016-12-10
      • 1970-01-01
      相关资源
      最近更新 更多