2017-08-05 7 views
2

ASP.NET Core 2 Preview 2にアップグレードしただけで、depedencyインジェクションの問題が発生しました。私はコア2プレビュー2にアップグレードした後で「タイプのサービスを解決できませんでした」というメッセージが表示される

を得る

タイプの 方法「設定」のパラメータ「文脈」のタイプ 「LC.Tools.API.Data.GenericDbContext」のサービスを解決できませんでした「LC.Tools.API.Startup」プロジェクトを実行するときは です。

古いバージョンを使用しているときにこの問題は発生しませんでした。

DbContext(GenericDbContext):

namespace LC.Tools.API.Data 
{ 
    public class GenericDbContext : DbContext 
    { 
     public GenericDbContext(DbContextOptions<GenericDbContext> options) : base(options) { } 

     protected override void OnModelCreating(ModelBuilder builder) 
     { 
      //Generic 
      builder.Entity<Client>(); 
      builder.Entity<Graphic>(); 
      . 
      . 
      . 
      . 
      . 

      //Shop 
      builder.Entity<Models.Shop.Store>().ToTable("ShopClient"); 
      builder.Entity<Models.Shop.Category>().ToTable("ShopCategory"); 
      . 
      . 
      . 
      . 
      . 
      . 
    } 
} 

Startup.cs:

namespace LC.Tools.API 
{ 
    public class Startup 
    { 
     public Startup(IHostingEnvironment env) 
     { 
      var builder = new ConfigurationBuilder() 
       .SetBasePath(env.ContentRootPath) 
       .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true) 
       .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true) 
       .AddEnvironmentVariables(); 
      Configuration = builder.Build(); 

      this.HostingEnvironment = env; 
     } 

     public void ConfigureServices(IServiceCollection services) 
     { 
      services.AddOptions(); 
      services.AddDbContext<Data.GenericDbContext>(options => options.UseSqlServer(this.ConnectionString)); 

      services.AddMvc(); 
     } 

     public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory, Data.GenericDbContext context) 
     { 
      loggerFactory.AddConsole(Configuration.GetSection("Logging")); 
      loggerFactory.AddDebug(); 

      if (env.IsDevelopment()) 
      { 
       app.UseForwardedHeaders(new ForwardedHeadersOptions 
       { 
        ForwardedHeaders = Microsoft.AspNetCore.HttpOverrides.ForwardedHeaders.XForwardedFor, 
        ForwardLimit = 2 
       }); 

       app.UseDeveloperExceptionPage(); 
       app.UseBrowserLink(); 
      } 

      app.UseStaticFiles(); 
      app.UseMvc(); 

      Data.Debug.Init.Initalize(context, env); 
     } 

     private IHostingEnvironment HostingEnvironment { get; set; } 

     public IConfigurationRoot Configuration { get; } 

     private string ConnectionString 
     { 
      get 
      { 
       return this.HostingEnvironment.IsDevelopment() ? Configuration.GetConnectionString("Development") : Configuration.GetConnectionString("Production"); 
      } 
     } 
    } 
} 

例外:アプリケーションを起動しながら

エラーが発生しました。

InvalidOperationException:スコープ付きサービスを解決できません 'LC.Tools.API.Data.GenericDbContext'をルートプロバイダから解決できません。

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(タイプ サービス種別、のServiceProviderのサービス・プロバイダ)例外: パラメータの型 'LC.Tools.API.Data.GenericDbContext' のサービスを解決できません でした「コンテキスト'タイプのメソッド' Configure 'のタイプ ' LC.Tools.API.Startup '。

Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke(オブジェクト 例えば、IApplicationBuilderビルダー)

InvalidOperationException: Cannot resolve scoped service 
        'LC.Tools.API.Data.GenericDbContext' from root provider. 

Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteValidator.ValidateResolution(タイプ サービス種別、のServiceProviderのサービス・プロバイダ) Microsoft.Extensions.DependencyInjection.ServiceProvider.GetService(Type serviceType) Microsoft.Extensions.DependencyInjection.ServiceProviderServiceExtensions.GetRequiredService(IServiceProvider プロバイダー、タイプserviceT YPE) Microsoft.AspNetCore.Hosting.Internal.ConfigureBuilder.Invoke(オブジェクト 例えば、IApplicationBuilderビルダー)

+0

これはhttps://stackoverflow.comを助けている場合を参照してください。/questions/44180773/dependency-injection-in-asp-net-core-2-thows-exception – Nkosi

+0

あなたは動作しない 'Configure'メソッドにコンテキストを注入しようとしています。注入されたコンテキストを 'Configure'メソッドから削除し、代わりにサービスプロバイダを注入し、メソッド内のコンテキストを解決しようとします。 – Nkosi

+0

asp.net core 1で動作して以来、最後のバージョンで何が変わったのか知りたいと思います。カスタム実装では必要ないはずだと思っています。 – TheRuler

答えて

3

あなたは仕事を文句を言わないConfigure方法にコンテキストを注入しようとしています。注入されたコンテキストをConfigureメソッドから削除し、代わりにサービスプロバイダを挿入し、メソッド内のコンテキストを解決しようとします。

+0

ありがとう!あなたのコードを使って作業しました – TheRuler

+0

'Configure'に注入するのではなく、' ConfigureServices'メソッドの中ですべてを実際にやったかもしれませんが、それはあなたの選択です。 – Nkosi

+0

サービスプロバイダを構築する必要はありません。なぜあなたは実際にそれをやっているのか分かりません。 – davidfowl

1

@ Nkosiさんの答えは正しい軌道に乗っていますが、実際にはバージョン2では多くのステップは必要ありません。0と最大:

public void ConfigureServices(IServiceCollection services) { 
    services.AddOptions(); 
    services.AddDbContext<Data.GenericDbContext>(options => options.UseSqlServer(this.ConnectionString)); 

    services.AddMvc(); 
} 

public void Configure(IApplicationBuilder app, IHostingEnvironment env, 
         ILoggerFactory loggerFactory, IServiceProvider serviceProvider) { 
    //...Other code removed for brevity 

    var context = serviceProvider.GetService<Data.GenericDbContext>(); 
    Data.Debug.Init.Initalize(context, env); 
} 

あなたはConfigureServicesから何かを返すか、私が実行しているバージョン(2.0)で、中間プロバイダを構築する必要はありません

関連する問題