なぜEmployee Controllerでこのエラーが発生するのか残りの部分は完全に機能しています
_public class EmployeeController : ApiController
{
#region Call service
private readonly IEmployeeServices _employeeServices;
public EmployeeController(IEmployeeServices employeeServices)
{
_employeeServices = employeeServices;
}
readonly IEmployeeServices employeeServices = new EmployeeServices();
public EmployeeController():base()
{
_employeeServices = employeeServices;
}
}
_
そして、これは私の完璧に機能する製品コントローラーです
_public class ProductController : ApiController
{
#region Call service
private readonly IProductServices _productServices;
public ProductController(IProductServices productServices)
{
_productServices = productServices;
}
readonly IProductServices productServices = new ProductServices();
public ProductController()
{
_productServices = productServices;
}
}
_
ここにスタックトレースがあります
エラーが発生しました。「EmployeeController」タイプのコントローラーを作成しようとしたときにエラーが発生しました。コントローラーのSystem.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request、HttpControllerDescriptor controllerDescriptor、Type controllerType)#xD;にパラメーターのないpublic constructor.System.InvalidOperationExceptionがあることを確認してください。 System.Web.Http.Controllers.HttpControllerDescriptor.CreateController(HttpRequestMessage request)#xD;でSystem.Web.Http.Dispatcher.HttpControllerDispatcher。<SendAsync> d__1.MoveNext()でエラーが発生しました。依存関係の解決に失敗しました。タイプ= "TheWork.Controllers.EmployeeController"、name = "(none)"。#xD ;次の間に例外が発生しました:while.resolving。#xD;例外は次のとおりです。InvalidOperationException-現在のタイプBusinessServices.IEmployeeServicesはインターフェースであり、構築できません。型マッピングがありませんか?#xD; -----------------------------------------------#xD;例外の時点で、コンテナは次のとおりでした:#xD; #xD; TheWork.Controllers.EmployeeController、(none)#xD;の解決;コンストラクターTheWork.Controllers.EmployeeController(BusinessServices.IEmployeeServices employeeServices)#xD;のパラメーター「employeeServices」の解決BusinessServices.IEmployeeServices、(none)#xDの解決; Microsoft.Practices.Unity.UnityContainer.DoBuildUpでのMicrosoft.Practices.Unity.ResolutionFailedException(タイプt、既存のオブジェクト、文字列名、IEnumerable
1 resolverOverrides)
 at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides)
 at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer container, Type t, ResolverOverride[] overrides)
 at Unity.WebApi.UnityDependencyScope.GetService(Type serviceType)
 at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func
1アクティベーター)#xD; System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request、HttpControllerDescriptor controllerDescriptor、Type controllerType)でエラーが発生しました。現在の型BusinessServices.IEmployeeServicesはインターフェイスであり、構築できません。型マッピングがありませんか?Microsoft.Practices.ObjectBuilder2.DynamicMethodConstructorStrategy.ThrowForAttemptingToConstructInterface(IBuilderContext context)#xD;のSystem.InvalidOperationException at lambda_method(Closure、IBuilderContext)#xD; Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext。<> c__DisplayClass1。<GetBuildMethod> b__0(IBuilderContext context)#xD;でMicrosoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)#xD;でMicrosoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)#xD;でMicrosoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)#xD; Microsoft.Practices.ObjectBuilder2.BuilderContext.NewBuildUp(NamedTypeBuildKey newBuildKey)#xD;でMicrosoft.Practices.Unity.ObjectBuilder.NamedTypeDependencyResolverPolicy.Resolve(IBuilderContext context)#xD;でat lambda_method(Closure、IBuilderContext)#xD; Microsoft.Practices.ObjectBuilder2.DynamicBuildPlanGenerationContext。<> c__DisplayClass1。<GetBuildMethod> b__0(IBuilderContext context)#xD;でMicrosoft.Practices.ObjectBuilder2.DynamicMethodBuildPlan.BuildUp(IBuilderContext context)#xD;でMicrosoft.Practices.ObjectBuilder2.BuildPlanStrategy.PreBuildUp(IBuilderContext context)#xD;でMicrosoft.Practices.ObjectBuilder2.StrategyChain.ExecuteBuildUp(IBuilderContext context)#xD; Microsoft.Practices.Unity.UnityContainer.DoBuildUp(Type t、Object existing、String name、IEnumerable`1 resolverOverrides)で
更新
ここにUnityの構成があります
_ public static class UnityConfig
{
public static void RegisterComponents()
{
var container = new UnityContainer();
System.Web.Mvc.DependencyResolver.SetResolver(new UnityDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);
RegisterTypes(container);
}
public static void RegisterTypes(IUnityContainer container)
{
ComponentLoader.LoadContainer(container, ".\\bin", "TheWork.dll");
ComponentLoader.LoadContainer(container, ".\\bin", "BusinessServices.dll");
ComponentLoader.LoadContainer(container, ".\\bin", "DataModel.dll");
}
}
_
スタックトレースに埋もれていることが問題の根本原因です。
InvalidOperationException-現在のタイプBusinessServices.IEmployeeServicesはインターフェースであり、使用できません構築されています。タイプマッピングがありませんか? ---- -------------------------------------------例外の時点で、コンテナは:Resolving TheWork.Controllers.EmployeeController、(none)Resolvingパラメーター "employeeServices"コンストラクターTheWork.Controllers.EmployeeController(BusinessServices.IEmployeeServices employeeServices)Resolving BusinessServices.IEmployeeServices、(none)Microsoft.Practices.Unity.ResolutionFailedException Microsoftで。 Practices.Unity.UnityContainer.DoBuildUp(Type t、Object existing、String name、IEnumerable1 resolverOverrides)
問題は、EmployeeController
にはIEmployeeServices
のインスタンスが必要ですが、Unityはインスタンス化する具体的な型を知らないことです。実装クラスはComponentLoader.LoadContainer(container, ".\\bin", "BusinessServices.dll");
の呼び出しによって登録されることになっているようですが、何らかの理由で登録されていません。そのコードのバグであるか、BusinessServices.dllが古く、IEmployeeServices
定義が含まれていない可能性があります。
すべてのコードとランタイムの依存関係を確認せずにIEmployeeServices
が登録されない理由を説明することは困難です(型が動的にロード/登録されるため)。
コントローラーにパラメーターなしのパブリックコンストラクターがあることを確認してください
public class EmployeeController : ApiController
{
#region Call service
private readonly IEmployeeServices _employeeServices;
public EmployeeController(IEmployeeServices employeeServices)
{
_employeeServices = employeeServices;
}
readonly IEmployeeServices employeeServices = new EmployeeServices();
public EmployeeController()
{
_employeeServices = employeeServices;
}
}
この方法を試してください:)
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<IEmployeeServices >().To<EmployeeServices >().InRequestScope();
}