如何访问嵌套的Unity Dependency Injection创建的对象?

时间:2015-05-27 14:41:54

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

这是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) {...}
}

一切正常但我不确定如何在Controller中访问Unity创建的工作单元对象以保存更改: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如何为服务使用相同的对象,以及服务如何将其用于存储库?

1 个答案:

答案 0 :(得分:1)

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

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