【问题标题】:How to access nested Unity Dependency Injection created objects?如何访问嵌套的 Unity 依赖注入创建的对象?
【发布时间】:2015-05-28 12:49:37
【问题描述】:

这是 Unity 的初学者问题,请见谅。

在我的 Unity 配置中,我有以下创建我的数据库上下文(实体框架)、工作单元和存储库模式对象(来自 reverse pocosgeneric repo/uow):

container
.RegisterType<IDataContextAsync, myDbContext>(
    new PerRequestLifetimeManager(),
    new InjectionConstructor(new object[] { connString }))
.RegisterType<IUnitOfWorkAsync, UnitOfWork>(new PerRequestLifetimeManager())
.RegisterType<IRepositoryAsync<Contact>, Repository<Contact>>()

在 Microsoft MVC 中,我的控制器被注入了服务:

public myController(IContactService contactService) {
    _contactService = contactService;
}

我的服务注入了存储库:

public class ContactService : Service<Contact>, IContactService 
{
    public ContactService( IRepositoryAsync<Contact> repository) {...}
}

一切正常,但我不确定如何访问控制器中 Unity 创建的 Unit of Work 对象以保存更改:UnitOfWork.SaveChangesAsync()

在没有 DI 的情况下,创建对象的方法如下:

IRepositoryProvider repoProvider = new RepositoryProvider( new RepositoryFactories());
IDataContextAsync context = new MyDbContext();
IUnitOfWorkAsync uow = new UnitOfWork(context, repoProvider);
IRepositoryAsync contactRepo = new Repository<Contact>(context, uow);

...  // database changes

uow.SaveChangesAsync(); // In the Controller

显而易见的事情是在 Controller 构造函数中引用一个 UOW,但是 Unity 将如何将同一对象用于 Service,以及 Service 将如何将其用于存储库?

【问题讨论】:

  • 我认为最好让控制器忘记存在工作单元这一事实。这使得控制器更简单并防止错误,因为有人忘记保存工作单元。因此,最好将此责任转移到已使用的服务上,或者甚至更好的是,使用将自动提交 uow 的装饰器包装服务。这方面的例子可以看到here
  • @Steven 因此,鉴于我们有服务句柄保存更改,服务如何在不创建这些对象本身的情况下获得指向存储库引用的同一 UOW 对象的链接?
  • 我认为我链接到的 q/a 可以回答这个问题等等。
  • @Steven 首先是好文章。在打印、阅读和突出显示两篇文章之后,我可以看到您可以使用 .Handle() 方法装饰 UnitOfWork,但我仍然无法理解您在哪里可以获得对持有 .Handle() 的对象的引用,所以您可以在服务中调用它?

标签: c# asp.net-mvc dependency-injection unity-container


【解决方案1】:

你已经解决了自己的问题……

您的 UnitOfWork 类已注册到 PerRequestLifetimeManager。此生命周期将确保在同一 MVC 请求中解决 UOW 时,您将收到相同的实例。因此,您将自动获取传递给控制器​​构造函数的 UOW 实例,就像传递给存储库构造函数一样。

【讨论】:

  • 有趣!所以你是说,如果我的服务中有工作单元的构造函数参数和存储库,那么 Unity 将创建工作单元对象并使用该对象来创建存储库?所以我需要做的就是将 IUnitOfWorkAsync 引用放在任何 Service 的构造函数中,然后调用 .SaveChangesAsync() 并且存储库更改将持续到数据库中?
  • 没错。看看其他生命周期管理器,以便您了解对象的范围。这对于线程问题(间歇性且难以解决)很重要。
猜你喜欢
  • 1970-01-01
  • 2011-12-31
  • 2015-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多