依赖项注入仅在一个控制器上失败
本文关键字:一个 控制器 失败 注入 依赖 | 更新日期: 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>();