2015-05-27 25 views
0

这是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>>() 

在微软MVC,我控制器注射服务:

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

我的服务与存储库注入:

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

一切都运行良好,但我不知道如何访问团结创建工作单元对象在控制器保存更改: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

我认为最好让控制员不要忘记有一个工作单元的事实。这使得控制器更简单,并防止错误,因为有人忘了保存工作单元。所以最好把这个责任转移到使用过的服务上,或者更好的做法是用装饰器来包装服务,这些服务器会自动提交uow。这个例子可以在这里看到(https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91)。 – Steven

+0

相关:https://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why – Steven

+0

@Steven因此,如果我们有服务句柄保存更改,服务如何获得链接到相同的UOW对象引用的对象而不是自己创建这些对象? –

回答

1

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

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

+0

有趣!所以你在说,如果我有工作单元的构造函数参数,并且在我的Service中有一个存储库,Unity将创建工作单元对象并使用该对象来创建存储库?所以我需要做的就是把IUnitOfWorkAsync引用放在任何Service的构造函数中,然后调用。SaveChangesAsync()和存储库更改将持续到数据库? –

+0

这是正确的。看看其他终生管理者,以及你了解你的对象的范围。这对线程问题很重要(间歇性和讨厌的故障排除)。 – TylerOhlsen