繁体   English   中英

如何使用Ninject向我的UnitOfWork添加服务层?

[英]How do I add a service layer to my UnitOfWork using Ninject?

我尝试设置DI时遇到了一个小路障。

所以鉴于我有这个控制器:

public UsersController(IUnitOfWork unitOfWork)
{
   // Stuff
}

我以前有这个UnitOfWork实现直接访问我的存储库。

public class UnitOfWork : IUnitOfWork, IDisposable
{
  private readonly DbContext _context = new DbContext();

  public IRepository<User> Users { get { return new UserRepository(_context); } }
}

Ninject UnitOfWork code: Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();

现在这实际上工作正常。 但是,我想要更改它,以便包含存储库的UnitOfWork,而不是包含多个存储库的服务。

public class UserService : IUserService
{
  private readonly IUserRepository _userRepository;
  public UserService(IUserRepository userRepository, /* Other repositories */)
  {
    _userRepository = userRepository;
  }
}

现在我能想出的唯一解决方案是

public class UnitOfWork : IUnitOfWork, IDisposable
{
  private readonly DbContext _context = new DbContext();

  public IUserService UserService
  {
    get
    {
      return new UserService(new UserRepository(_context), /* etc. */);
    }
  }
}

这似乎不对。 现在我自己创建所有服务依赖项。

我在StackOverflow上看过一些帖子,提到最好让服务访问多个存储库并处理业务逻辑,而不是让控制器(MVC应用程序)担心它。

但是找不到有关如何正确执行此操作的任何细节。 那我怎么能用Ninject来做我想要的事呢?

对不起,这真的是一个杂乱无章的评论,但嘿......

DbContext 是一个工作单元,并创建一个跨越两个DbContexts的怪物工作单元绝对不是一般模式(因此你的问题sez you)

这个答案的评论在这里回答了一个相关的问题

在尝试以这种方式解决之前要问自己的问题:

  • 除了拥有DbContext之外,你试图用我的这个工作单元完成什么?
  • 这需要交易吗?
  • 实际上是否存在中间缺少的服务,它应该有自己的数据引用另外两个?
  • 这是否需要跨越两个有界上下文? 如果你以后需要再把它们拉出来怎么办?
  • 如果我在我的应用程序中有3个这样的情况,我会不断将它们合并到一个BC中? 4?

对我来说,关键是创建自己的UoW来包装UoW:

  1. 不会给你买多少
  2. 让你更难以解释你的核心问题

如果您仍然要使用Ninject来解决这个问题,那么技术方法是同时使用Context Preservation和Factory Extensions - 请阅读其wiki中的示例。 如果你决定剥离东西,它们可能还有部分可以玩。

更新:我现在抓住你的漂移 - 重要的是链接到预先指导你思考的东西。 首先,去读一下 接下来,决定你是否有一个工作单元。 如果是这样,谁将在何处提交并处理它?

如果存储库和/或服务要共享UoW或DBContext,而某些东西将集中提交内容,那么您将要共享/处置的内容绑定到InRequestScope中以获取它a)获取单个共享实例b)获取处置

我的主要关注点仍然是所有这些抽象是否真的有益于事物 - 你是否真的在编写使用抽象的测试(而不仅仅是前几个)? 你真的要切换存储库吗? 我个人会多次阅读DDD书作为更好的时间投资。

我意识到很多这是非常光顾的,这只是一个简单的问题,代表了一个更大的问题的一部分,但我刚刚看到太多的问题,最近由包装层和DI容器欺骗的交集提示,因此我的咆哮。 完R,谢谢!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM