仅在一个控制器上的依赖注入失败

时间:2013-08-06 10:30:01

标签: c# asp.net-mvc dependency-injection unity-container

我有两个具有相同配置的MVC项目,他们使用Unity进行依赖注入。

第一个有10个控制器,第二个有20个控制器,依赖注入适用于所有这些,并且已经运行了一年多。

今天我尝试将1个控制器从第一个项目复制到第二个项目,当我运行它时,我得到:

[MissingMethodException: No parameterless constructor defined for this object.]
   System.RuntimeTypeHandle.CreateInstance(RuntimeType type, Boolean publicOnly, Boolean noCheck, Boolean& canBeCached, RuntimeMethodHandleInternal& ctor, Boolean& bNeedSecurityCheck) +0
   System.RuntimeType.CreateInstanceSlow(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +113
   System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipCheckThis, Boolean fillCache, StackCrawlMark& stackMark) +232
   System.Activator.CreateInstance(Type type, Boolean nonPublic) +83
   System.Activator.CreateInstance(Type type) +6
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +55

[InvalidOperationException: An error occurred when trying to create a controller of type 'Web.Admin.Controllers.ApplyController'. Make sure that the controller has a parameterless public constructor.]
   System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +179
   System.Web.Mvc.DefaultControllerFactory.GetControllerInstance(RequestContext requestContext, Type controllerType) +80
   System.Web.Mvc.DefaultControllerFactory.CreateController(RequestContext requestContext, String controllerName) +74
   System.Web.Mvc.MvcHandler.ProcessRequestInit(HttpContextBase httpContext, IController& controller, IControllerFactory& factory) +197
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +49
   System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContext httpContext, AsyncCallback callback, Object state) +50
   System.Web.Mvc.MvcHandler.System.Web.IHttpAsyncHandler.BeginProcessRequest(HttpContext context, AsyncCallback cb, Object extraData) +16
   System.Web.CallHandlerExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +301
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +155

对于该控制器而言,它只是应用DefaultcontrollerActivator而不是统一控制器。

我已经使用web.config超过一个小时了,看起来很好,Unity已注册并且所有依赖项,而Application_Start与使用同一个控制器的第一个项目相同。 我无法想象除了那个控制器之外什么都行不通。

我尝试将控制器简化为基础,但仍然会发生这种情况。

我在下面发布了一些代码,但我不认为它会有所帮助,因为我有一个相同的实例,但没有。无论哪种方式,应用程序开始如下所示:

 var container = Ioc.ContainerWrapper.Container as IUnityContainer;
            container
                .ConfigureAutoRegistration()
                .ExcludeAssemblies(t => !t.FullName.StartsWith("Alpari."))
                .Include(If.ImplementsITypeName, Then.Register())
                .ApplyAutoRegistration();

       container.RegisterType<INHibernateContext, NHibernateContext>();

       container.RegisterType<HttpContextBase>(new InjectionFactory(x => new HttpContextWrapper(HttpContext.Current)));
       container.RegisterType<IAuthentication, FormsAuthenticationWrapper>();
       container.RegisterType<IApplyService, ApplyService>();

       /* register loads of interfaces */
       AreaRegistration.RegisterAllAreas();

       ViewEngines.Engines.Clear();
       ViewEngines.Engines.Add(new LocalizedViewEngine());

       DependencyResolver.SetResolver(new UnityDependencyResolver());

此处应用依赖项解析程序,这适用于除ApplyController之外的所有控制器,而ApplyController似乎正在尝试使用默认解析程序。

构造函数有10个接口,但我尝试这样做,我得到了同样的错误:

    public ApplyController(IApplyService applyService)
    {
        this.applyService = applyService;
    }

此时我需要提出可能出错的建议或如何调试。

2 个答案:

答案 0 :(得分:1)

尝试直接从Unity容器中解析ApplyController(通过调用container.Resolve<ApplyController>())。此调用将失败,并带有描述性异常,以解释真正的问题。

有关为什么会这样做的更多信息,请阅读this

  

构造函数有10个接口

与您的问题无关,但这听起来违反了Single responsibility principle。具有许多依赖项的类通常难以测试,读取和维护。将来,您应该尝试减少依赖项的数量。

答案 1 :(得分:0)

参考以下代码;我认为问题与ApplyService的构建阶段有关。这意味着,当通过ApplyService解析时,容器无法发起ApplyController。您可以检查构造链是否具有任何层次依赖性,这些依赖性是失败的。

container.RegisterType<IApplyService, ApplyService>();