Ninject + MVC3没有注入控制器
我已经使用了NuGet Ninject MVC3扩展,并且根据请求无法将其注入控制器。 它似乎没有绑定,因为MVC正在寻找无参数的构造函数。 这是堆栈跟踪:
[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) +98 System.RuntimeType.CreateInstanceDefaultCtor(Boolean publicOnly, Boolean skipVisibilityChecks, Boolean skipCheckThis, Boolean fillCache) +241 System.Activator.CreateInstance(Type type, Boolean nonPublic) +69 System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +67 [InvalidOperationException: An error occurred when trying to create a controller of type 'MyApp.Presentation.Controllers.SearchController'. Make sure that the controller has a parameterless public constructor.] System.Web.Mvc.DefaultControllerActivator.Create(RequestContext requestContext, Type controllerType) +182 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) +199 System.Web.Mvc.c__DisplayClass6.b__2() +49 System.Web.Mvc.c__DisplayClassb`1.b__a() +13 System.Web.Mvc.SecurityUtil.b__0(Action f) +7 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Action action) +22 System.Web.Mvc.SecurityUtil.ProcessInApplicationTrust(Func`1 func) +124 System.Web.Mvc.MvcHandler.BeginProcessRequest(HttpContextBase httpContext, AsyncCallback callback, Object state) +98 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() +8862676 System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +184
而我正试图注入的控制器(目前需要一个基类):
public class SearchController : MainBaseController { private readonly MyApp.Domain.Tutor.TutorSearch TutorSearch; protected static readonly log4net.ILog _log = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType); [Ninject.Inject] public SearchController(MyApp.Domain.Tutor.TutorSearch tutorSearch) { this.TutorSearch = tutorSearch; } .... (no other constructors) }
和我的NinjectWebCommon.cs的相关部分:
private static IKernel CreateKernel() { var kernel = new StandardKernel(); kernel.Bind<Func>().ToMethod(ctx => () => new Bootstrapper().Kernel); kernel.Bind().To(); RegisterServices(kernel); return kernel; } /// /// Load your modules or register your services here! /// /// The kernel. private static void RegisterServices(IKernel kernel) { INinjectModule[] modules = new INinjectModule[] { new Domain.DomainModule() }; kernel.Load(Assembly.GetExecutingAssembly()); kernel.Load(modules); kernel.Bind().ToSelf(); // *************** var t = kernel.Get(); }
最后,这是DomainModule:
public class DomainModule : NinjectModule { public override void Load() { Bind().To(); Bind().To(); } }
正如您在标有星号的行中的NinjectWebCommon.cs中所看到的,我尝试将控制器显式构建为测试。 这适用于正确注入Xml..Providers,效果非常好。
有没有我错过的东西? 我不太了解NuGet MVC3扩展的内容,因此不知道控制器绑定在哪个方面失败。
任何关于要看什么的指针都将非常感谢,谢谢。
经过一段时间的绝望修补,我终于找到了问题所在。 我正在引用MVC4(System.Web.Mvc)DLL并且没有将旧版3.0.0.0的绑定重定向到4.0.0.0:
至少,我希望这是一个不错的解决方案。
编辑:如下所示,以下行更简洁:
使用Visual Studio和Nuget,您需要运行此命令
安装包Ninject.MVC3
(根据您运行的MVC版本替换3)
这将解决您的问题
Traw,有一个特殊的原因,你使用的是具体的实现,而不是Interfaces。 就目前而言,你直接从DI中获得零益处(我很惊讶你得到任何工作)我会重构并把所有东西都放在一个接口之后,然后将接口绑定到具体实现。
这是一个快速拍摄可能看起来如何:
// 'imagined' ISearchType interface public interface ISearchType { int Id { get; set; } string LastName { get; set; } } // 'imagined' TutorSearch concrete class public class TutorSearch : ISearchType { public int Id { get; set; } public string LastName { get; set; } } // your revised controller code private readonly ISearchType _tutorSearch; public SearchController(ISearchType searchType) { _tutorSearch = searchType; }
然后,在您注册服务(ninject)时,您需要添加:
kernel.Bind().To();
这应该会让你更进一步。 另外, var t = kernel.Get<...>
实际上什么也没做 – 只是如果你想知道’它’发生了什么。
玩得开心…