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

本文关键字:一个 控制器 失败 注入 依赖 | 更新日期: 2023-09-27 18:26:43

我有两个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之外的所有控制器,后者似乎正在尝试使用默认解析程序。

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

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

在这一点上,我需要关于什么可能出错或如何调试的建议。

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

尝试直接从Unity容器解析ApplyController(通过调用container.Resolve<ApplyController>())。此调用将失败,并出现一个说明性异常,该异常将解释实际问题。

有关为什么会发生这种情况的更多信息,请阅读本文。

构造函数有10个接口

与你的问题无关,但这听起来违反了单一责任原则。具有如此多依赖关系的类通常很难测试、读取和维护。将来,您应该尽量减少依赖项的数量。

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

container.RegisterType<IApplyService, ApplyService>();