ASP.NETコア: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ようなMigrationを使いたいと思います。しかし、これは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ディレクティブの後の最初の部分は、インタフェースを定義します。 2番目の部分は、インスタンスを保持する変数の名前です。

サービスをすべてのビューにグローバルに挿入するには、この行を_ViewImports.cshtmlに追加します。完全な新しいASP.NETコアプロジェクトでは、すでに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
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ