【发布时间】: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® .NET 解决方案”。第 6 章 - 数据访问层。有第二版,但更像是第二卷,我还没有读过。
-
@Cortez9 我还没读过它,所以如果不理解导致作者写这篇文章的力量和约束,很难回答。在这个空间中任何合理的答案都必须以it取决于开头,但由于我不知道它取决于什么,我无法回答。
标签: c# architecture domain-driven-design data-access-layer software-design