這是Unity的初學者問題,請原諒我。如何訪問嵌套的Unity依賴注入創建的對象?
在我的統一配置我有一個創建我的數據庫環境(實體框架),工作單位,以及庫模式對象(從reverse pocos和generic 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如何將同一對象用於服務,以及服務如何將其用於存儲庫?
我認爲最好讓控制員不要忘記有一個工作單元的事實。這使得控制器更簡單,並防止錯誤,因爲有人忘了保存工作單元。所以最好把這個責任轉移到使用過的服務上,或者更好的做法是用裝飾器來包裝服務,這些服務器會自動提交uow。這個例子可以在這裏看到(https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=91)。 – Steven
相關:https://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why – Steven
@Steven因此,如果我們有服務句柄保存更改,服務如何獲得鏈接到相同的UOW對象引用的對象而不是自己創建這些對象? –