gpt4 book ai didi

C#/EF 和存储库模式 : Where to put the ObjectContext in a solution with multiple repositories?

转载 作者:太空狗 更新时间:2023-10-29 22:28:36 24 4
gpt4 key购买 nike

我的应用程序中有多个存储库。我应该把 ObjectContext 放在哪里?现在,我在每个存储库中都有一个类似 ObjectContext ctx; 的引用。解决此问题最明智、最安全的方法是什么?

最佳答案

具有多个 ObjectContext 的设计instances 仅在您的 Repository 时才可接受方法提交事务。否则,提交事务的外部调用可能不会保留您想要的所有内容,因为您将持有对 ObjectContext 的不同实例的引用。 .

如果你想限制ObjectContext到单个实例,那么你可以构建一个 RepositoryProvider包含 ObjectContext 的类,并管理存储库操作到数据提交的传播。这可以通过以下任一方式最好地完成,- 注入(inject) ObjectContext引用每个存储库,或- 将存储库的事件订阅到 EventHandlerObjectContext 上调用适当方法的 s .

以下是我用过的高度可插拔的实现:

存储库提供者接口(interface)

public interface IRepositoryProvider
{
IRepository this[Type repositoryType] { get; }
}

存储库工厂接口(interface)

该实现依赖于 IEnumerable<IFilteredRepositoryFactory> .

public interface IFilteredRepositoryFactory{
bool CanCreateRepository(Type repositoryType);
IRepository CreateRepository(Type repositoryType, ObjectContext context);
}

所以,实现看起来像:

存储库提供者类

public class RepositoryProvider
{
public RepositoryProvider(ObjectContext context, IEnumerable<IFilteredRepositoryFactory> repositoryFactories)
{
_context = context;
_repositoryFactories = repositoryFactories;
}

private readonly ObjectContext _context;
private readonly IEnumerable<IFilteredRepositoryFactory> _repositoryFactories;
private readonly Dictionary<Type, IRepository> _loadedRepositories;

IRepository this[Type repositoryType]
{
get
{
if(_loadedRepositories.ContainsKey(repositoryType))
{
return _loadedRepositories[repositoryType];
}
var repository = GetFactory(repositoryType).CreateRepository(repositoryType, _context);
_loadedRepositories.Add(repositoryType,repository);
return repository;
}
}

IFilteredRepositoryFactory GetFactory(Type repositoryType)
{
//throws an exception if no repository factory is found
return _repositoryFactories.First(x => x.CanCreateRepository(repositoryType));
}
}

需要注意的是一个新的Repository将由第一个匹配工厂实现创建。因此,如果工厂集合包含多个可以创建 Repository 的工厂对于给定的存储库 Type , 第一个 IFilteredRepositoryFactory枚举中的对象将被使用,任何后续工厂将被忽略。另外,如果没有注册工厂,也会抛出异常。

关于C#/EF 和存储库模式 : Where to put the ObjectContext in a solution with multiple repositories?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5032810/

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