2015-05-27 67 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