gpt4 book ai didi

repository-pattern - 急切加载和存储库模式

转载 作者:行者123 更新时间:2023-12-03 11:58:31 25 4
gpt4 key购买 nike

我想知道在使用存储库模式时如何正确处理复杂对象图的急切加载问题。我猜这不是 ORM 特定的问题。
第一次尝试:

public interface IProductRepository : IRepository<Product>
{
Product GetById(int id);
IProductRepository WithCustomers();
}
这可以正常工作,但这将涉及一直重复自己(在任何地方的存储库实现中编写自定义的“With”方法)。
下一个方法:
public interface IRepository<T> where T : IAggregateRoot
{
...
void With(Expression<Func<T, object>> propToExpand);
}
With方法将向私有(private)集合添加一个项目,稍后将使用该项目来找出在检索必要的实体时应该立即加载哪些 Prop 。
这种工作很好。但我不喜欢用法:
productRepository.With(x=>x.Customer);
productRepository.With(x=>x.Price);
productRepository.With(x=>x.Manufacturer);
var product = productRepository.GetById(id);
基本上 - 问题是没有链接。我希望它是这样的:
var product = productRepository
.With(x=>x.Customer)
.With(x=>x.Price)
.With(x=>x.Manufacturer)
.GetById(id);
I couldn't achieve this .即使我可以 - 我不确定该解决方案是否优雅。
这导致我认为我错过了一些基本的东西(任何地方都没有例子)。有不同的方法来处理这个吗?什么是最佳实践?

最佳答案

有趣的问题,我相信你不是第一个遇到这个问题的人(我绝对有)。

对我来说,真正的问题是:你想把你的急切加载逻辑放在哪里?

在客户端代码中的存储库之外

var product = productRepository
.With(x=>x.Customer)
.With(x=>x.Price)
.With(x=>x.Manufacturer)
.GetById(id);

我不认为这是一个好的软件设计:如果这样的结构分散在你的整个应用程序中,看起来这可能会导致“千刀万剐”。

或在存储库中 .例子:
interface IProductRepository {
Product GetById(int id);
Product GetByIdWithCustomers(int i);
}

因此,您的客户端代码将如下所示:
var product = productRepository.GetByIdWithCustomers(id);

通常我会创建一个 BaseRepository,它只定义了基本的 CRUD 操作:
public class BaseRepository<TEntity, TPrimaryKey> {
public void Save(TEntity entity) { ... }
public void Delete(TEntity entity) { ... }
public TEntity Load(TPrimaryKey id) { ... } // just gets the entity by primary key
}

然后我扩展了这个基类/接口(interface),以便为获取域对象提供特定的方法。您的方法似乎朝着有点相似的方向发展。
public class MediaRepository : BaseRepository<Media, int> {
public long CountMediaWithCategories() { ... }
public IList<Media> MediaInCategories(IList<Category> categories) { .... }
}

好消息:所有 ORM 内容(急切加载配置、获取深度等)都封装在 Repository 类中,客户端代码只获取结果集。

我尝试使用非常通用的存储库,就像您尝试做的那样,但我最终大多为我的域对象编写特定的查询和存储库。

关于repository-pattern - 急切加载和存储库模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1619231/

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