[英].NET Core 2 & DI - use values from appsettings.json in the constructor?
[英]Using ApplicationDbContext with DI from appsettings.json
我試圖從我的ApplicationDbContext類中抽象出任何連接信息,以便我可以利用不同的數據庫進行開發,登台,生產。 我首先從Startup.cs注冊一個服務
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
我的ApplicationDbContext類:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
: base(options)
{
}
protected override void OnModelCreating(ModelBuilder builder)
{
base.OnModelCreating(builder);
}
}
運行此應用程序時,我收到以下錯誤:
InvalidOperationException :無法創建“SquadApps.Data.ApplicationDbContext”類型的實例。 模型綁定的復雜類型不能是抽象或值類型,並且必須具有無參數構造函數。
所以我很自然地嘗試添加無參數構造函數
public ApplicationDbContext() { }
現在又出現了另一個錯
InvalidOperationException :尚未為此DbContext配置任何數據庫提供程序。 可以通過覆蓋DbContext.OnConfiguring方法或在應用程序服務提供程序上使用AddDbContext來配置提供程序。 如果使用AddDbContext,那么還要確保您的DbContext類型在其構造函數中接受DbContextOptions對象,並將其傳遞給DbContext的基礎構造函數。
如果我回到在ApplicationDbContext類中存儲連接字符串,如下所示:
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlServer("........");
}
然后一切正常,但顯然這不是理想的,可能是一個不好的做法。 我認為DI過程中缺少一些東西,任何建議或建議都會受到贊賞。
解決方案原來是我試圖調用DI的方式。 我錯誤地假設DI可以在我的控制器內的每個IActionResult中調用,但實際上它必須在控制器的構造函數中發生。 這使得DI可用於控制器內的所有IActionResult方法。
工作DI呼叫的示例:
public class HomeController : Controller
{
private readonly ApplicationDbContext _ctx;
private readonly CompanySettings _companySettings;
public HomeController(ApplicationDbContext ctx, IOptions<CompanySettings> settings)
{
_ctx = ctx;
_companySettings = settings.Value;
}
public IActionResult Index()
{
var model = new HomeViewModel();
// _ctx and _companySettings can be used here
return View(model);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.