2017-11-24 16 views
3

私は.net core web apiで私の手を試しています。あなたが見ることができるように私は私がDbContextに渡す私のConnectionStringを、含まれている私の設定クラスを解決したい、.netコアの注入と解決のサービス

public static class RegistrationExtensions 
{ 
    public static void RegisterApplicationServices(this IServiceCollection services, IServiceProvider serviceProvider) 
    { 
     services.RegisterSingletons(); 
     services.RegisterRequests(); 
     services.RegisterTransient(serviceProvider); 
    } 

    public static void RegisterSingletons(this IServiceCollection services) 
    { 
     services.AddSingleton<Configuration>(); 
    } 

    public static void RegisterRequests(this IServiceCollection services) 
    { 
     services.AddScoped<ISettingsService, SettingsService>(); 
    } 

    public static void RegisterTransient(this IServiceCollection services, IServiceProvider serviceProvider) 
    { 
     var config = serviceProvider.GetService<Configuration>(); 
     services.AddDbContext<InteractiveChoicesContext>(m => m.UseSqlServer(config.ConnectionString)); 
    } 
} 

:私はこのように私のコントローラを登録するための静的メソッドを作成しました。 構成を解決するRegisterApplicationServicesメソッドに注入しようとしていました。

は、このメソッドを呼び出すには、私は スタートアップクラスの ConfigureServicesはこれにを変更:

public void ConfigureServices(IServiceCollection services, IServiceProvider serviceProvider) 
{ 
    services.AddMvc(); 
    services.RegisterApplicationServices(serviceProvider); 
} 

をしかし、私は自分のアプリケーションを実行すると、私はエラーを取得:

The ConfigureServices method must either be parameterless or take only one parameter of type IServiceCollection.

エラーを明らかです。私の質問は、設定クラスを私のRegisterTransientの方法で解決するにはどうすればいいですか?

+0

スタートアップクラスは、IConfiguration型の構成プロパティを持って後世と関連性のためにそのまま含まれています。それはあなたが必要とするものですか?あるいは、あなた自身のConfigurationクラスについて話していますか? – CodeFuller

答えて

2

AddDbContextのオーバーロードは、実際にはAction<IServiceProvider, DbContextOptionsBuilder>になります。これはまさにあなたが探しているものでなければなりません。

例:EFコア2.0.0に指定されている。この過負荷のため

services.AddDbContext<InteractiveChoicesContext>((provider, options) => 
{ 
    var config = provider.GetService<Configuration>(); 
    options.UseSqlServer(config.ConnectionString); 
}); 

ドキュメントは、

// 
// Summary: 
//  Registers the given context as a service in the 
//  Microsoft.Extensions.DependencyInjection.IServiceCollection. 
//  You use this method when using dependency injection in your application, such 
//  as with ASP.NET. For more information on setting up dependency injection, see 
//  http://go.microsoft.com/fwlink/?LinkId=526890. 
//  This overload has an optionsAction that provides the applications 
//  System.IServiceProvider. 
//  This is useful if you want to setup Entity Framework to resolve its internal 
//  services from the primary application service provider. By default, we recommend 
//  using the other overload, which allows Entity Framework to create and maintain 
//  its own System.IServiceProvider for internal Entity Framework services. 
// 
// Parameters: 
// serviceCollection: 
//  The Microsoft.Extensions.DependencyInjection.IServiceCollection to add services 
//  to. 
// 
// optionsAction: 
//  An optional action to configure the Microsoft.EntityFrameworkCore.DbContextOptions 
//  for the context. This provides an alternative to performing configuration of 
//  the context by overriding the Microsoft.EntityFrameworkCore.DbContext 
//  .OnConfiguring(Microsoft.EntityFrameworkCore.DbContextOptionsBuilder) 
//  
//  method in your derived context. 
//  If an action is supplied here, the 
//  Microsoft.EntityFrameworkCore.DbContext 
//  .OnConfiguring(Microsoft.EntityFrameworkCore.DbContextOptionsBuilder) 
//  method will still be run if it has been overridden on the 
//  derived context. Microsoft.EntityFrameworkCore.DbContext 
//  .OnConfiguring(Microsoft.EntityFrameworkCore.DbContextOptionsBuilder) 
//  configuration will be applied in addition to configuration performed here. 
//  In order for the options to be passed into your context, you need 
//  to expose a constructor on your context that takes 
//  Microsoft.EntityFrameworkCore.DbContextOptions`1 
//  and passes it to the base constructor of 
//  Microsoft.EntityFrameworkCore.DbContext. 
// 
// contextLifetime: 
//  The lifetime with which to register the DbContext 
// service in the container. 
// 
// optionsLifetime: 
//  The lifetime with which to register the DbContextOptions 
//  service in the container. 
// 
// Type parameters: 
// TContext: 
//  The type of context to be registered. 
// 
// Returns: 
//  The same service collection so that multiple calls can be chained. 
public static IServiceCollection AddDbContext<TContext>(
    [NotNullAttribute] this IServiceCollection serviceCollection, 
    [CanBeNullAttribute] Action<IServiceProvider, DbContextOptionsBuilder> optionsAction, 
    ServiceLifetime contextLifetime = ServiceLifetime.Scoped, 
    ServiceLifetime optionsLifetime = ServiceLifetime.Scoped 
) where TContext : DbContext; 
0

あなたが代わりにIConfigurationを使用する独自の設定クラスを使用する必要がある場合、あなたはすでにあなたのConfigurationシングルトンの登録を持っているあなたのケースではこれ、あなたのIServiceCollectionはこれまでに構成解決するためにこれを行うことができます:

public static void RegisterTransient(this IServiceCollection services) 
{ 
    // Use services registered so far 
    var serviceProvider = services.BuildServiceProvider(); 

    var config = serviceProvider.GetRequiredService<Configuration>(); 
    services.AddDbContext<InteractiveChoicesContext>(m => m.UseSqlServer(config.ConnectionString)); 
} 

BuildServiceProvider()は、アセンブリ内の拡張メソッドであるMicrosoft.Extensions.DependencyInjection、名前空間Microsoft.Extensions.DependencyInjectionです。

関連する問題