ASP.NET Core:DB CF遷移的依賴注入

.net-core asp.net-core-mvc c# dependency-injection entity-framework-core

我正在使用依賴注入在ASP.NET MVC核心應用程序的控制器中註冊我的DbContext,如下所示:

public void ConfigureServices(IServiceCollection services) {
    return new MyContext(connectionString); }
        services.AddScoped<IMyContext, MyContext>((serviceProdiver) => {
            return new MyContext(Configuration["ConnectionStrings:MyContext"]); 
        });
        services.AddMvc();
    }

這很好用。但是現在我想使用像Add-Migration Initial -Context MyContext這樣需要無參數構造函數Add-Migration Initial -Context MyContext 。但這會破壞DI模式,因為我需要從經典的ASP.NET MVC中回退到單例模式,如下所示:

public class MyContext:MySqlDbContext, IMyContext {
    public MyContext() : base(Startup.Configuration["ConnectionStrings:MyContext"] {
    }
}

我喜歡避免這種情況,因此在我的新ASP.NET Core項目中使用DI。這是否可以使用數據庫遷移,或者不是針對DI更新的遷移工具,因此除此之外沒有其他方法可以使用舊的單例模式?

熱門答案

哇,你犯了很大的錯誤。您不需要將一些配置添加到MyContext,因為它是自動生成的文件。你有什麼事嗎?您必須添加一些配置文件,例如RegisterServices,否則它將是擴展名。例如

public static class ServiceCollectionExtensions
{
 public static IServiceCollection RegisterServices(
    this IServiceCollection services)
{
    services.AddTransient<ICountryService, CountryService>();
    // and a lot more Services

    return services;
}

}

之後,您必須在ConfigureServices中註冊此配置文件,例如

public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();

services.RegisterServices();
}

最後,您可以使用服務或存儲庫

public class HomeController : Controller 
{ 
private readonly ICountryService _countryService; 

 public HomeController(ICountryService countryService) 
 { 
    _countryService = countryService; 
 } 
// … 
}

或者,在ASP.NET Core MVC中,我們也可以將此服務注入MVC​​視圖。以下行定義了Razor視圖中的注入:

@inject DiViews.Services.ICountryService CountryService;

@inject指令後面的第一部分定義了接口。第二部分是保存我們實例的變量的名稱。

要將全局服務注入所有視圖,請將此行添加到_ViewImports.cshtml。在一個全新的ASP.NET Core項目中,已經為ApplicationInsights定義了一個全局注入:

@inject Microsoft.ApplicationInsights.Extensibility.TelemetryConfiguration TelemetryConfiguration

我們現在可以在視圖中使用該實例:

@if (countryService.All().Any()) 
{ 
 <ul> 
    @foreach (var country in CountryService.All().OrderBy(x => x.Name)) 
    { 
        <p>@country.Name (@country.Code)</p> 
    } 
 </ul> 
 }

我們還可以使用此服務填寫國家/地區列表中的選擇字段:

@Html.DropDownList("Coutries", CountryService.All() 
.OrderBy(x => x.Name) 
.Select(x => new SelectListItem 
{ 
    Text = x.Name, 
    Value = x.Code 
}))

我希望,這對你有所幫助



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow