我有两个具有相同配置的 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;
}
在这一点上,我需要关于可能出现什么问题或如何调试的建议。