web-dev-qa-db-ja.com

タイプ「EmployeeController」のコントローラーを作成しようとしたときにエラーが発生しました。コントローラーにパラメーターなしのパブリックコンストラクターがあることを確認してください

なぜ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、既存のオブジェクト、文字列名、IEnumerable1 resolverOverrides)&#xD; at Microsoft.Practices.Unity.UnityContainer.Resolve(Type t, String name, ResolverOverride[] resolverOverrides)&#xD; at Microsoft.Practices.Unity.UnityContainerExtensions.Resolve(IUnityContainer container, Type t, ResolverOverride[] overrides)&#xD; at Unity.WebApi.UnityDependencyScope.GetService(Type serviceType)&#xD; 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");
        }
}
_
6
Dummy

スタックトレースに埋もれていることが問題の根本原因です。

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が登録されない理由を説明することは困難です(型が動的にロード/登録されるため)。

12

コントローラーにパラメーターなしのパブリックコンストラクターがあることを確認してください

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;
        }
}
0
Leon Barkan

この方法を試してください:)

        /// 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();
        }
0
Gaurav Kaushik