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

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(使用前将#替换为@)

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

  • 如何在两台电脑之间共享svn仓库

    我的工作站上有 SVN 存储库 我在工作站和笔记本电脑上都使用它 在工作站上 我可以在本地访问存储库 但在笔记本电脑上 我必须连接互联网才能访问存储库 这不方便 因为我无法在飞机 火车和其他无互联网的地方工作 我想比较修订等 在笔记本电脑上
  • MVVMLight——将参数传递给 ViewModel 构造函数?

    假设我有一个 ListBox 它绑定到一个集合Foo对象 以及选定的Foo显示在内容控件中 内容模板是FooView 有没有一种方法可以让我做到这一点FooView通过所选的Foo的构造函数FooViewModel这是它的数据上下文View
  • @Context 返回 Proxy 而不是 HttpServletRequest (代理范围内没有线程本地值)

    我不太明白为什么 Context依赖注入返回 Proxy random number 实例的集合 而不是 HttpServletRequest 或 HttpServletResponse 我正在使用 Glassfish 3 1 2 2 及其
  • 带有限定符的类型 Set 的依赖关系不满足

    我是创建 Web 服务 Restful api 的新手 遵循 Java Brains for Restful Web 服务的简单教程 我收到错误 内容类似于 带有限定符 Default 的类型集的依赖关系不满足 我在这里搜索了不同的问题 尝
  • 如何从 Github 和 Bitbucket 上的 git 删除提交

    我不小心从 Django 项目中的 idea 目录中推送了文件 这些文件位于 gitignore 文件中 我正在尝试从我的 bitbucket 存储库中完全删除提交 因为我正在与该项目一起工作的其他人 并且他无法在不影响他自己的 idea
  • Bitbucket:从提示绑定文件以供下载

    我在一个私人存储库中工作 并与我的朋友合作 他对 SCM 之类的东西不太友好 他所需要的只是监控我开发的最新版本 这是 1 个可执行文件 我想知道 而不是每次他想要获取最新更改时克隆整个存储库 有时我的更改集可能由几个仅在开发时使用而不是测
  • Dagger组件依赖含义

    我正在尝试 Dagger 2 我只是通过测试来了解这个框架 我有一个 ApplicationComponent 需要成为整个应用程序的单例 所以我将其定义如下 Component modules ApplicationModule clas
  • Spring - 如何注入具体的接口实现?

    我需要通过 Autowired 注入服务类的具体实现 服务接口 public interface PostService 执行 Service postServiceImpl public class PostServiceImpl imp
  • Autofac - 解决多线程环境中的依赖关系

    public class MultithreadTester public void Run var builder new ContainerBuilder builder RegisterType
  • 如何在 ASP.NET MVC Web 应用程序中使用 Ninject?

    我创建了一个新的 MVC Web 应用程序 并且引用了 Ninject dll Ninject Web Common dll 和 Ninject Web MVC dll Global asax cs public class MvcAppl
  • 使用 TinyIoC 进行构造函数注入

    我刚刚从 Ninject 更改为 TinyIoC 进行依赖项注入 但在构造函数注入方面遇到了问题 我已设法将其简化为以下片段 public interface IBar public class Foo public Foo IBar ba
  • 再次将服务注入域对象

    我有一个对地理数据进行操作的特定域 我正在 TypeScript 和 NodeJS 中实现这个项目 并有以下类 Point 包含纬度和经度的值对象 Area 包含点集作为形状定义的值对象 Sector 实体 它不是持久的 但它是可变的 包含
  • 类型 RoleStore 不可分配给服务 IRoleStore

    我正在尝试使用 Autofac 为使用 MVC5 和 EF6 的项目设置依赖项注入 我很难弄清楚如何正确解耦 EntityFramework RoleStore 实现 我只想依赖 Identity IRoleStore 但我知道对于泛型类
  • Spring部署期间依赖注入问题

    我正在启动一个 Primefaces Spring Hibernate 项目 并且仍在学习如何正确处理这些组件 但就在此时 我面临着一个与 spring 依赖注入相关的问题 这让我很害怕 我已经在网上寻找答案两天了 但找不到我的代码有什么问
  • 为什么通用存储库被视为反模式? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 在我看来 许多专门的存储库类都具有相似的特征 并且让这些类实现一个概述这些特征的接口 创建一个通用存储库是有意义的 为了说明我的观点 假设我们有
  • 无法使用 Hilt 注入 workmanager 构造函数

    我正在开发一个 Android 应用程序 我尝试将 hilt 与 workmanager 构造函数一起使用 但它不起作用并给出了此错误 2020 08 18 19 01 09 989 18125 18759 com E WM WorkerF
  • 跨程序集和命名空间的依赖注入

    我正在解决一个 DI 问题 我认为我了解其原因 但我需要一些建议来解决 我构建了一个与 Sql 对话的独立程序集 将此程序集称为 a 以及另一个包含业务逻辑的程序集 将此程序集称为 b 我在 b 程序集中为 db 类创建了一个接口 由于该接
  • 重新创建 svn 存储库

    在一次重大服务器故障之后 svn 存储库被破坏 我的工作版本是最新版本 从我的工作版本重新创建 svn 存储库的方法是什么 在新服务器上安装 svn 并尝试我的工作副本之后 svn switch NEW SVN PATH 我收到一个错误 R
  • 再次对存储库和持久性一无所知

    这就是我要做的 我有一个通用的存储库类Repository
  • 将新文件推送到新存储库 Git

    我是 git 新手 还没有完全了解工作流程 因此 我在 github com 上创建了一个存储库 并且能够从我的计算机推送所有文件 现在我已经在 github 上创建了一个新的存储库 并在我的计算机上创建了一个新文件夹 所有内容都从新文件夹

随机推荐