我有两个具有相同配置的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;
}
此时我需要提出可能出错的建议或如何调试。
答案 0 :(得分:1)
尝试直接从Unity容器中解析ApplyController
(通过调用container.Resolve<ApplyController>()
)。此调用将失败,并带有描述性异常,以解释真正的问题。
有关为什么会这样做的更多信息,请阅读this。
构造函数有10个接口
与您的问题无关,但这听起来违反了Single responsibility principle。具有许多依赖项的类通常难以测试,读取和维护。将来,您应该尝试减少依赖项的数量。
答案 1 :(得分:0)
参考以下代码;我认为问题与ApplyService
的构建阶段有关。这意味着,当通过ApplyService
解析时,容器无法发起ApplyController
。您可以检查构造链是否具有任何层次依赖性,这些依赖性是失败的。
container.RegisterType<IApplyService, ApplyService>();