如何访问嵌套的Unity依赖注入创建对象

本文关键字:Unity 依赖 注入 创建对象 嵌套 何访问 访问 | 更新日期: 2023-09-27 17:51:01

这是Unity初学者的问题,所以请原谅我。

在我的Unity配置中,我有以下创建我的数据库上下文(实体框架),工作单元和存储库模式对象(从反向pocos和通用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创建的工作单元对象在控制器中保存更改: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将如何为repository使用它呢?

如何访问嵌套的Unity依赖注入创建对象

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

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