【发布时间】:2021-11-10 10:17:42
【问题描述】:
我正在尝试在 C#/.NET 中为我的存储库实现工作单元模式。我的计划是将 UoW 作为存储库的参数。这是一个如何使用它的示例:
using (var uow = new UnitOfWork())
{
var itemRepository = new ItemRepository(uow);
itemRepository.Add(new Item());
uow.Commit();
}
此外,对于简单的操作(不需要事务时),存储库应该能够在没有工作单元的情况下使用:
var itemRepository = new ItemRepository();
var item = itemRepository.Get(itemId);
UnitOfWork/Repository 可以从 ConnectionFactory 获取数据库连接。连接工厂通过依赖注入接收连接选项。但是,这是我的问题:存储库如何获取对 ConnectionFactory 实例的引用? 存储库是手动创建的,因此它们不能通过构造函数注入依赖项。一种选择是拥有存储库工厂,可以注入它们的依赖项。在这种情况下,用法可能是这样的:
using (var uow = new UnitOfWork())
{
var itemRepository = itemRepositoryFactory.Create(uow);
itemRepository.Add(new Item());
uow.Commit();
}
该解决方案的缺点是每个存储库都需要自己的工厂,而且会有很多。 是否有其他解决方案可以规避此问题?
【问题讨论】:
-
你为什么不通过
IoC容器(在 web 应用程序的情况下)或main方法(在控制台类型的情况下)通过依赖注入创建 everything应用程序)?例如,不建议在您的应用程序启动阶段或Http request开始之后在之后实例化任何服务。 -
唯一不通过 DI 实例化的组件是存储库。对于存储库,我必须能够提供 UoW 实例。一种选择是要求存储库方法使用 UoW 参数,但这使用起来有点麻烦。
-
我没有使用实体框架,所以存储库是围绕原始 sql 查询的合理抽象。
-
@wekso 你在使用
.Net Core吗?或者.Net Framework带有依赖注入库(如Ninject)?如果您注册UnitOfWork(在请求范围中,以便在请求完成后处理它)并在某个构造函数中请求repository,会发生什么?
标签: c# .net dependency-injection repository unit-of-work