我正在尋找與我的asp.net核心2.0應用程序中的工作單元實現存儲庫模式。使用.net核心中使用依賴注入(DI)原理的例子並不多。我試圖重寫在文檔中找到的this example。我也嘗試在可能的地方添加異步操作。如何使用工作單元實例化依賴注入?
現在的想法是,工作單元將它自己的dbcontext傳遞給正在使用的每個實體的GenericRepository。然後確保你使用一個dbcontext,即使你在兩個實體上工作。
在我的控制器我取一些數據是這樣的:
var model = new IndexViewModel
{
Companies = await _unitOfWork.CompanyRepository.GetAsync()
};
在我使用DI正在創建的DbContext工作單位。然後,它爲每個實體創建GenericRepository的新實例,同時它通過它的DbContext到genericrepository的構造器:
private ApplicationDbContext _context;
private GenericRepository<Company> companyRepository;
private GenericRepository<Person> personRepository;
public UnitOfWork(ApplicationDbContext context)
{
_context = context;
}
public GenericRepository<Company> CompanyRepository
{
get
{
if (this.companyRepository == null)
{
this.companyRepository = new GenericRepository<Company>(_context);
}
return companyRepository;
}
}
//repeat for Person
但我擔心的依賴注入將自動創建每個I使用GenericRepository時間爲一個新的DbContext。
public class GenericRepository<TEntity> where TEntity : class
{
internal ApplicationDbContext _context;
internal DbSet<TEntity> dbSet;
public GenericRepository(ApplicationDbContext context)
{
_context = context;
dbSet = context.Set<TEntity>();
}
//...other methods
}
我擔心這實際上會創建兩個上下文。每一個(如果有兩個請求)?所以實際上,dbcontext會被實例化三次,一次是單位工作,一次是每個存儲庫? Here is a link到github上的應用程序。它正在工作,但我想了解它是如何工作的。感謝任何答案!
我的dbcontext是有作用域的,這同樣是我在dbcontext中發送到的單元。我想知道的是,當我從這個相同的unitofwork類創建genericrepository的一個實例並將它的dbcontext傳遞到genericrepository構造函數時會發生什麼?我假設genericrepository將使用相同的上下文,而不是創建一個新的。但由於genericrepository的構造函數需要一個dbcontext,所以我擔心dbcontext的依賴注入會覆蓋這個並創建一個新的。對不起,如果這很混亂。我感謝你的回答:) –
當你實例化通用資源庫並傳入db context(它被注入你的UoW)時,那麼根本就沒有涉及IoC容器。 IoC沒有編譯器的魔力,它在運行時發生,並且從不使用'new'關鍵字。只要你不'new'你的'DbContext',就不會有一個不同的實例 – Tseng
回想起來,我以爲我已經爲我的GenericRepository使用了一個接口並將它註冊爲DI(我在我的本地代碼,不在github中)。因爲我想知道如果創建一個新類會發生什麼,並且將它的構造函數傳遞給設置爲通過DI自動注入的相同類型(但它通常無關緊要,但這裏重要的是上下文很重要工作單位傳遞的是使用的類型)。 –