gpt4 book ai didi

c# - 没有 ORM 的存储库模式

转载 作者:IT王子 更新时间:2023-10-29 04:35:13 26 4
gpt4 key购买 nike

我在不使用 ORM 的 .NET C# 应用程序中使用存储库模式。但是我遇到的问题是如何填充实体的一对多列表属性。例如如果客户有一个订单列表,即如果 Customer 类有一个名为 Orders 的 List 属性,而我的存储库有一个名为 GetCustomerById 的方法,那么呢?

  • 我应该在 GetCustomerById 方法中加载订单列表吗?
  • 如果 Order 本身有另一个列表属性等等怎么办?
  • 如果我想延迟加载怎么办?我应该把代码放在哪里以加载客户的 Orders 属性?在 Orders 属性中获取{}访问器?但是我必须将存储库注入(inject)域实体吗?我认为这不是正确的解决方案。

这也引发了对更改跟踪、删除等功能的疑问?所以我认为最终结果是我可以在没有 ORM 的情况下进行 DDD 吗?

但现在我只对在我的域实体中延迟加载列表属性感兴趣?有什么想法吗?

纳比尔

我假设对于没有在领域驱动设计中使用 ORM 的人来说,这是一个非常普遍的问题?有什么想法吗?

最佳答案

can I do DDD without ORM ?

是的,但是 ORM 简化了事情。

老实说,我认为您的问题与您是否需要 ORM 无关 - 这是您对数据而不是行为的过多思考,而行为是 DDD 成功的关键。就数据模型而言,大多数实体都会以某种形式与大多数其他实体建立关联,从这个角度来看,您可以遍历整个模型。这就是您的客户和订单的样子,也许也是您认为需要延迟加载的原因。但是您需要使用聚合将这些关系分解为行为组。

例如,为什么要为客户聚合建模以包含订单列表?如果答案是“因为客户可以有订单”,那么我不确定您是否采用 DDD 的思维方式。

有什么行为要求客户有订单 list ?当您更多地考虑域的行为(即在什么时候需要什么数据)时,您可以根据用例对聚合进行建模,事情变得更加清晰和容易,因为您只更改一小部分对象的跟踪在聚合边界。

我怀疑 Customer 应该是一个没有订单列表的单独聚合,而 Order 应该是一个包含订单行列表的聚合。如果您需要对客户的每个订单执行操作,请使用 orderRepository.GetOrdersForCustomer(customerID);进行更改,然后使用 orderRespository.Save(order);

关于不使用 ORM 的更改跟踪,您可以通过多种方式执行此操作,例如,订单聚合可以引发订单存储库正在监听的已删除订​​单行的事件。当工作单元完成时,这些可以被删除。或者稍微不那么优雅的方法是维护已删除的列表,即您的存储库显然可以读取的 order.DeletedOrderLines。

总结:

  • 我认为你需要更多地考虑行为而不是数据
  • ORM 让变更跟踪变得更轻松,但没有 ORM 也可以,没有 ORM 也绝对可以做 DDD。

编辑以回应评论:

我认为我不会为订单行实现延迟加载。您可能在不需要订单行的情况下对订单执行哪些操作?我怀疑的不多。

但是,当 DDD 的“规则”似乎没有意义时,我不会将其局限在其中,所以...不需要填充订单行的对象 AND 通常有大量订单行与订单相关联(两者都必须为真,我才会认为这是一个问题)然后我会这样做:

在订单对象中有这个私有(private)字段:

private Func<Guid, IList<OrderLine>> _lazilyGetOrderLines;

将由订单存储库传递给创建时的订单:

Order order = new Order(this.GetOrderLines);

这是 OrderRepository 上的私有(private)方法:

private IList<OrderLine> GetOrderLines(Guid orderId)
{
//DAL Code here

}

然后在订单行属性中可能如下所示:

public IEnumberable<OrderLine> OrderLines
{
get
{
if (_orderLines == null)
_orderLines = _lazilyGetOrderLines(this.OrderId);

return _orderLines;
}
}

编辑2

我发现这篇博文与我的解决方案类似,但更优雅:

http://thinkbeforecoding.com/post/2009/02/07/Lazy-load-and-persistence-ignorance

关于c# - 没有 ORM 的存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5017969/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com