0

私はこのようなASP.NET MVCアプリケーションのコアのコントローラで私のDbContextを登録するには、依存性注入を使用しています:ASP.NETコア:DB CF移行のための依存性の注入

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のような移行を使用したいと思います。私は、次のような古典的なASP.NET MVCからシングルトンパターンにフォールバックする必要がありますので、しかし、これは、DIのパターンを破壊するであろう:

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

私は結果的に私の新しいASP.NETコアプロジェクトでDIを使用するためにこれを避けるのが好き。これはデータベースマイグレーションを使用して可能ですか?それとも、以前のシングルトンパターンを使用する代替手段がないために、DI用のマイグレーションツールはまだ更新されていませんか?

+0

私は役立ちましたファクトリー登録を使用する場合は、2番目のコンストラクターを追加するだけで済みます。 –

答えて

0

うわー、あなたは非常に大きな間違いを犯しました。 自動生成されたファイルであるため、設定をMyContextに追加する必要はありません。 何をすべきですか? 設定ファイルのいくつか、たとえばRegisterServicesを追加する必要があります。そうしないと、拡張子が適用されます。例

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

    return services; 
} 

}の

その後、あなたは、あなたがサービスまたはリポジトリ

public class HomeController : Controller 
{ 
private readonly ICountryService _countryService; 

public HomeController(ICountryService countryService) 
{ 
    _countryService = countryService; 
} 
// … 
} 
を使用することができます

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

services.RegisterServices(); 
} 

最後例えば、ConfigureServicesでこの設定ファイルを登録する必要があります

または、現時点ではASP.NETの新しい機能Cor e MVCは、このサービスをMVCビューに挿入することもできます。次の行は、かみそりビューで注入を定義:

@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 
})) 

私は願って、それはあなた

関連する問題