如何将存储库注入到工作单元?

2024-04-08

我已经实现了我的 UnitOfWork,以便它保留对所有存储库的引用。

public interface IUnitOfWork
{
   void Commit();
   void RollBack();
}

public interface IMyUnitOfWork : IUnitOfWork
{
   IFooRepository Foos { get; }
   IBarRepository Bars { get; }
   // Other repositories ...
}

请注意,存储库实现了通用类型的存储库接口。

public interface IFooRepository : IRepository<Entities.Foo>
{
    // FooRepository specific methods goes here.
}

public interface IRepository<T> : IRepository
    where T : class
{
}

现在我如何将这些存储库注入到我的 UnitOfWork 中。当然,我希望它们具有延迟加载行为。例如:

public class ConcreteUnitOfWork : IMyUnitOfWork
{
   private readonly IUnityContainer unityContainer;
   private IFooRepository fooRepository;

   public ConcreteUnitOfWork(IUnityContainer unityContainer)
   {
      this.repositoryFactory = repositoryFactory;
   }

   public IFooRepository Foos
   {
      get 
      { 
         return this.fooRepository ?? 
            (this.fooRepository = unityContainer.Resolve<IFooRepository>()); 
      }
   }
}

我知道将 Unity 容器传递给 UnitOfWork 是不正确的,但是您会提供什么模式来解决这个问题?

您可能会提到,我不应该将存储库引用保留在 UnitOfWork 中,但请假设一个服务类需要多个存储库。通过这种设计,我可以将 UnitOfWork 作为构造函数参数(构造函数注入)传递给服务类,但是如果我没有将存储库引用保留在 UnitOfWork 中,我将必须将所有需要的存储库作为构造函数参数传递,您知道什么它导致。

- 更新 -

如果我完全错误,请告诉我,我永远不应该在 UnitOfWork 中编写存储库。那么请在这里给我一个关于“构造函数过度注入”的解决方案。

-- 更新2 --

似乎从 UnitOfWork 编写(引用)存储库打破了开放/关闭原则,因为当我们添加新存储库(添加新属性)时,我们需要更改 UnitOfWork 类。

如果是正确的那么我应该考虑重构。你能给我一些想法吗?


当前的设计方案似乎将不止一种职责混合到 IMyUnitOfWork 接口中。您说这是因为否则服务类可能需要独立地获取每个存储库。我假设你的意思是这样的:

public MyService(
   IUnitOfWork uow,
   IFooRepository fooRepository,
   IBarRepository barRepository)

在我看来,这是一个更简单、更干净的设计。

那么构造函数过度注入又如何呢?

嗯,就是这样……但问题是,这与您现在在 ConcreteUnitOfWork 实现中遇到的问题完全相同。您根本没有解决构造函数过度注入的问题 - 您只是将其移至另一个类。

实际上,通过将其移动到 ConcreteUnitOfWork 你已经成功了more很难处理这种情况。因为 ConcreteUnitOfWork 是一个纯粹的基础设施类(或者一个支持类,如果你愿意的话),它没有任何业务上下文,所以很难在这里提出解决构造函数过度注入气味的方法。

另一方面,给定的服务(或者可能是控制器)往往更专业并且了解业务上下文,因此不需要every存储库以完成其工作 - 或者如果确实如此,它可能会尝试做太多事情。

这样的具体业务组件可以更好地重构为 Facade Service http://blog.ploeh.dk/2010/02/02/RefactoringToAggregateServices.aspx.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将存储库注入到工作单元? 的相关文章

  • 与仅调用依赖函数/类相比,在 FastAPI 中使用 Depends 有哪些优点?

    FastAPI 提供了way https fastapi tiangolo com tutorial dependencies 通过其自己的依赖关系解析机制来管理依赖关系 例如数据库连接 它类似于一个pytest夹具系统 简而言之 您在函数
  • 合并来自并行 Subversion 存储库的更新代码

    我想知道人们在将实时 持续更新的 SVN 存储库与离线存储库 更新频率较低 合并时通常会采取哪些步骤 以我的场景为例 不久前我下载了BugTracker NET系统 当时它的版本是3 2 3 随后我对我们业务的代码进行了一些增强 我们使用
  • 是否有 Ubuntu 10.04 存储库可以下载最新版本的 Eclipse?

    我还没有找到一个可以安装 Eclipse 4 2 Juno 的软件 默认的 Ubuntu 存储库 我使用的是 Ubuntu 10 04 建议我使用古老的 Galileo 版本 我在 Launchpad 上找到了 Eclipse 的页面 该页
  • .Net 6 控制台应用程序:WebApplication.CreateBuilder 与 Host.CreateDefaultBuilder

    我正在研究 NET 6 并希望构建一个简单的控制台应用程序 并进行一些依赖项注入 据我所知 为了使启动 现在只是程序 文件更具可读性 已经做了很多工作 让我有点困惑的是 所有改进似乎都是针对 API 项目中使用的 WebApplicatio
  • 实体框架:在运行时更改连接字符串

    假设有一个 ASP NET MVC 应用程序使用 Entity Framework 6 和代码优先方法以及 StructureMap 作为 IoC 它还使用工作单元模式 域类 public class Product public int
  • 通用接口依赖注入工厂

    我正在玩 DI 和 Ninject 我愿意征求有关如何以其他方式解决此问题的建议 我试图确保 ICreateOrders 的具体实现可以被替换 如果需要的话 也许还有另一种方式或模式 像这样的解决方案 C Ninject IoC 和工厂模式
  • 依赖注入容器——工厂模式

    我一直在尝试了解依赖注入 并一直在阅读并尝试编写一个类似于以下内容的小型依赖注入容器 http fabien potencier org article 12 do you need a dependency injection conta
  • ASP.NET Core中间件如何进行DI?

    我正在尝试将依赖项注入到我的中间件构造函数中 如下所示 public class CreateCompanyMiddleware private readonly RequestDelegate next private readonly
  • 从 Autofac 容器解析通用接口的 IEnumerable

    我不确定这是否可能 我见过其他一些帖子提出类似的问题 但没有一个得到满意的答案 我想要做的是解析 Autofac 中具有不同泛型类型的接口集合 所以类的构造函数看起来像这样 public class SomeClass
  • 如何注入“运行时”依赖项,例如登录用户,该依赖项在应用程序启动时不可用?

    我只是不明白这个 我在我的 java GWT 应用程序中使用 Gin 来进行 DI 登录屏幕集成到完整的应用程序窗口中 用户登录后 我想将用户对象注入到我创建的其他类 例如 GUI Presenters 中 因此我相信存在某种运行时依赖性
  • Symfony - 自定义验证器和依赖注入

    我正在尝试对自定义验证器使用依赖项注入 以便能够使用实体管理器 我遵循 Symfony 示例 依赖注入 http symfony com doc current cookbook validation custom constraint h
  • 存储库模式和 Linq to sql

    我正在尝试使用角色表 用户表和具有用户 ID 角色 ID 的外部参照表来实现用户身份验证和授权 为了实现通用存储库来更新角色 插入角色 添加用户 将用户添加到角色 更新用户 更新用户角色 验证用户 添加用户会话进行审核等 我是否需要为每个存
  • 如何在单独的类库中管理客户端上下文对象?

    我正在尝试创建一个库 类库 对于共享点 它将拥有所有共享点 dll 来与共享点服务器交互上传文件 文档并创建文档库和文档集 现在这个库可以被使用客户端 例如 Web 应用程序 asp net webform 或 mvc 或控制台应用程序或
  • pom.xml 中的 Maven 标记

    默认情况下 Maven 将所有依赖项下载到 user home m2 repository 目录 我读到了 LocalRepository 标签 它允许我们更改默认路径 我尝试添加此标签在 pom xml 文件中添加不同位置 但我在 pom
  • 设置惰性静态变量首先初始化然后分配?

    我意识到static变量是隐式的lazy 这真的很棒 执行以下操作在第一次调用之前不会创建实例 static var test Test 但是 将一个新实例分配给static变量初始化原始实例 然后分配新实例 这对我来说很麻烦 SomeTy
  • @Inject 和 @PostConstruct 不适用于单例模式

    我有一堂课如下 public class UserAuthenticator private static UserAuthenticator authenticator Inject private UserRepository user
  • 传统 n 层设计中具有多个项目的 Git 存储库的最佳实践

    我正在从集中式 SCM 系统切换到 GIT 好吧 我承认是哪一个 它是 Visual SourceSafe 因此 除了克服 Git 命令和工作流程的学习曲线之外 我目前面临的最大问题是如何将我们当前的存储库迁移到 Git 对于单个存储库或多
  • Grails:在域类中动态注入服务

    我需要注入基于域属性的服务 到目前为止我想出了以下内容 ApplicationHolder application getServiceClass package property Service clazz 但以这种方式加载它不会注入它的
  • 使用策略和工厂模式进行依赖注入

    我正在开展一个业余项目 以更好地理解控制反转和依赖注入以及不同的设计模式 我想知道是否有将 DI 与工厂和策略模式结合使用的最佳实践 当策略 从工厂构建 需要每个可能的构造函数和实现不同的参数时 我面临的挑战就出现了 因此 我发现自己在服务
  • .net 4.7 中的依赖注入?

    我对 DI 有哪些集成选项有点困惑 我发现它对于 net core 对于我的特定项目 来说非常简单 但我不需要构建跨平台应用程序 也看不到使用 core 的优势 但是 net 框架应用程序似乎仍然使用 Global asax 设置且没有 S

随机推荐