2017-06-22 22 views
-1

私はどこでも解決策を探していますが、何も見つかりませんでした。以下は私の誇張エラーです。コントローラを解決するときにインターフェイスを構築できない

{ 
    "Message": "An error has occurred.", 
    "ExceptionMessage": "An error occurred when trying to create a controller of type 'TechnicianController'. Make sure that the controller has a parameterless public constructor.", 
    "ExceptionType": "System.InvalidOperationException", 
    "StackTrace": " at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)\r\n at System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)\r\n at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__1.MoveNext()", 
    "InnerException": { 
    "Message": "An error has occurred.", 
    "ExceptionMessage": "Resolution of the dependency failed, type = \"BackendApp.Controllers.TechnicianController\", name = \"(none)\".\r\nException occurred while: while resolving.\r\nException is: InvalidOperationException - The current type, System.Collections.Generic.IReadOnlyDictionary`2[System.Type,Microsoft.EntityFrameworkCore.Infrastructure.IDbContextOptionsExtension], is an interface and cannot be constructed. Are you missing a type mapping?\r\n-----------------------------------------------\r\nAt the time of the exception, the container was:\r\n\r\n Resolving BackendApp.Controllers.TechnicianController,(none)\r\n Resolving parameter \"helper\" of constructor BackendApp.Controllers.TechnicianController(Events_Tenant.Common.Core.Interfaces.ITechnicianRepository technicianRepository, Events_Tenant.Common.Helpers.IHelper helper)\r\n Resolving Events_Tenant.Common.Helpers.Helper,(none) (mapped from Events_Tenant.Common.Helpers.IHelper, (none))\r\n Resolving parameter \"tenantsRepository\" of constructor Events_Tenant.Common.Helpers.Helper(Events_Tenant.Common.Core.Interfaces.ICountryRepository countryRepository, Events_Tenant.Common.Core.Interfaces.ITenantsRepository tenantsRepository, Events_Tenant.Common.Core.Interfaces.IProviderRepository venuesRepository, Events_Tenant.Common.Core.Interfaces.IVenueTypesRepository venueTypesRepository)\r\n  Resolving Events_Tenant.Common.Core.Repositories.TenantsRepository,(none) (mapped from Events_Tenant.Common.Core.Interfaces.ITenantsRepository, (none))\r\n  Resolving parameter \"catalogDbContext\" of constructor Events_Tenant.Common.Core.Repositories.TenantsRepository(Events_TenantUserApp.EF.CatalogDB.CatalogDbContext catalogDbContext)\r\n  Resolving Events_TenantUserApp.EF.CatalogDB.CatalogDbContext,(none)\r\n  Resolving parameter \"options\" of constructor Events_TenantUserApp.EF.CatalogDB.CatalogDbContext(Microsoft.EntityFrameworkCore.DbContextOptions`1[[Events_TenantUserApp.EF.CatalogDB.CatalogDbContext, Events-TenantUserApp.EF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]] options)\r\n   Resolving Microsoft.EntityFrameworkCore.DbContextOptions`1[Events_TenantUserApp.EF.CatalogDB.CatalogDbContext],(none)\r\n   Resolving parameter \"extensions\" of constructor Microsoft.EntityFrameworkCore.DbContextOptions`1[[Events_TenantUserApp.EF.CatalogDB.CatalogDbContext, Events-TenantUserApp.EF, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null]](System.Collections.Generic.IReadOnlyDictionary`2[[System.Type, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[Microsoft.EntityFrameworkCore.Infrastructure.IDbContextOptionsExtension, Microsoft.EntityFrameworkCore, Version=1.1.2.0, Culture=neutral, PublicKeyToken=adb9793829ddae60]] extensions)\r\n   Resolving System.Collections.Generic.IReadOnlyDictionary`2[System.Type,Microsoft.EntityFrameworkCore.Infrastructure.IDbContextOptionsExtension],(none)\r\n", 
    "ExceptionType": "Microsoft.Practices.Unity.ResolutionFailedException", 
    "StackTrace": " at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides)\r\n at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides)\r\n at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer container, Type t, ResolverOverride[] overrides)\r\n at Unity.WebApi.UnityDependencyScope.GetService(Type serviceType)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)\r\n at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)", 
    "InnerException": { 
     "Message": "An error has occurred.", 
     "ExceptionMessage": "The current type, System.Collections.Generic.IReadOnlyDictionary`2[System.Type,Microsoft.EntityFrameworkCore.Infrastructure.IDbContextOptionsExtension], is an interface and cannot be constructed. Are you missing a type mapping?", 
     "ExceptionType": "System.InvalidOperationException", 
     "StackTrace": " at Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext context)\r\n at lambda_method(Closure , IBuilderContext)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)\r\n at Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)\r\n at lambda_method(Closure , IBuilderContext)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)\r\n at Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)\r\n at lambda_method(Closure , IBuilderContext)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)\r\n at Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)\r\n at lambda_method(Closure , IBuilderContext)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)\r\n at Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)\r\n at lambda_method(Closure , IBuilderContext)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)\r\n at Microsoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)\r\n at lambda_method(Closure , IBuilderContext)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext.<>c__DisplayClass1.<GetBuildMethod>b__0(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)\r\n at Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t, Object existing, String name, IEnumerable`1 resolverOverrides)" 
    } 
    } 
} 
+0

あなたのコントローラが持っていないように見えますがパラメタのないコンストラクタですが、それが渡されることを想定しています。そのインタフェースを自動的に渡すには、依存関係注入を使用する必要があります。すでに依存性注入を使用している場合は、インターフェイスをコンテナに登録する必要があります。それを見ると、依存症注入容器にIHelperを登録する必要があるように見えます。 – Woot

答えて

1

問題は、UnityがDbContextあるCatalogDbContextを解決しようとしていることです。デフォルトでは、Unityは最も多くのパラメータを持つコンストラクタを選択します。この場合、コンストラクタがあること:

public DbContext(DbContextOptions options); 

Unityは、コンストラクタを選択し、DbContextOptionsためIReadOnlyDictionary<Type, IDbContextOptionsExtension>であることを起こるすべての依存関係を、インスタンス化しようとしますので、もう一度DbContextOptionsオブジェクトを必要としています。残念なことに、Unityはインターフェイスの具体的なインスタンスをどのようにインスタンス化するか分からない

コントローラーがインスタンス化できず、赤色のビットであるときにWebApiによって「パラメーターなしのpublicコンストラクターがあることを確認する」メッセージが提供される実際に何が起こったのかは、パラメータのないコンストラクタが失敗し、おそらくパラメータのないコンストラクタを提供したくないからです。

上記は何が起きているかを示しています。

コントローラに必要な依存関係 が Unityで構成されていないために発生しているのはなぜですか。

の依存関係がどのように表示されているかを示すコードがないため、この問題を解決する方法は具体的には指定できません( "コンテナを構成する"の横に)。私はおそらくDbContextのためのDbContextOptionsコンストラクタのオーバーロードを使用したくないと思うでしょう - おそらくUnityがDbContextのためのデフォルトのコンストラクタを使用して問題を解決するのに十分であることを指定しますか?

以下のコメントに基づいて、接続文字列を入力するために問題に近づく方法はいくつかあります。

オプション1 - 接続文字列

は、接続文字列を注入し、DbContextでそれを使用します。

public class CatalogDbContext : DbContext 
{ 
    private readonly string connectionString; 

    public CatalogDbContext (string connectionString) 
    { 
     this.connectionString = connectionString; 
    } 

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
    { 
     optionsBuilder.UseSqlServer(this.connectionString); 
    } 
} 

var container = new UnityContainer(); 
container.RegisterType<CatalogDbContext>(new InjectionConstructor(GetCatalogConnectionString())); 

オプション2 - [オプションビルダー

public class CatalogDbContext : DbContext 
{ 
    public CatalogDbContext(DbContextOptions options) 
     : base(options) 
    { 
    } 
} 

var container = new UnityContainer(); 

var contextOptions = new DbContextOptionsBuilder() 
    .UseSqlServer(GetCatalogConnectionString()) 
    .Options; 

container.RegisterType<CatalogDbContext>(new InjectionConstructor(contextOptions)); 
+0

enlightmentのための@Randyに感謝します。実際のCatalogDbContextには、DbContextOptionsをパラメータとして使用し、このcontainer.RegisterType ();のようなunityConfigクラスを使用する請負業者があります。実際には、接続文字列を指定し、UnityConfigクラスで使用するコンストラクタを指定することが欲しいです。 –

+0

このコード行を 'services.AddDbContext (options => options.UseSqlServer(GetCatalogConnectionString()));' 'IServiceLocation'からUnity Unityに –

+1

ありがとう、私の人生を救った..それは魅力のように働いた.. –

関連する問題