2017-02-28 52 views
0

在轉向ASP.Net核心之前,我使用Ninject,它允許我以通用方式注入實體框架數據庫上下文。例如:ASP.Net核心MVC:按基類型的依賴注入

Bind<DbContext>().To<MyActualDbContext>(); 

在ASP.Net MVC的核心使用AddDbContext的時候,如果我這樣做,它會導致該服務正在得到解決。

AddDbContext<MyActualDbContext>(x=> x.UseSqlServer("...")); 
--- 
public class TestController: Controller { 
    public DbContext Db {get; private set;} 
    public TestController(DbContext Db){ 
     this.Db = Db; 
    } 
} 

我知道,我可以通過使用兩種AddSingletonAddScoped,但是解決這個問題,因爲AddDbContext已經專門開發用於處理EF數據方面,我想知道是否有任何方式使用該方法實現此目的。

如果AddDbContext不支持此行爲,哪種替代方法更好AddSingletoneAddScoped?我知道AddScoped每個請求實例化服務一次,但我想知道是否Singleton會導致任何潛在的問題或不。我想確保在ED DbContext的情況下使用這兩種方法不會有任何可能的缺點。

回答

2

您可以使用

// Or use AddTransient, makes no difference as it only wraps around the 
// container resolve method 
services.AddScoped<DbContext>(provider => provider.GetRequiredService<MyActualDbContext>()); 

但老實說,我不認爲這樣做一個好處,因爲基類不會有那麼你不能使用任何的是DbSets沒有它鑄造原來的代碼,但這種方式完全可以勝過擁有IoC的想法。

是的,單身DbContext是有問題的。它可能會導致內存泄漏(跟蹤緩存將不斷增長),如果將它放置在某處,DI系統將始終返回單件上下文的已部署實例。

+0

DbContext具有像「Set <>,Add <>,Entity <>等」的方法。允許你以通用的方式使用你的數據庫。假設你對同一個數據庫有不同的上下文。 – Arrrr

+0

'AddTransient'不是一個好主意(由於EF的跟蹤機制)。 – Arrrr

+0

在這種情況下,它並不重要,因爲對象的生命週期是通過「AddDbContext」控制的。當你將其註冊爲作用域時,即使調用了'services.AddScoped (provider => provider.GetRequiredService ()),'provider => provider.GetRequiredService ()'也將始終返回作用域實例。 ' – Tseng