0

我有两个具有相同配置的 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;
    }

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

4

2 回答 2

1

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

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

构造函数有10个接口

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

于 2013-08-06T10:37:49.180 回答
0

参考您的以下代码;我认为这个问题与 ApplyService. 这意味着,容器ApplyService在通过ApplyController. 你可以检查构造链是否有任何层次依赖,那些都失败了。

container.RegisterType<IApplyService, ApplyService>();
于 2013-08-06T10:46:21.713 回答