【问题标题】:Ninject.Web.Common and Ninject.Mvc isn't setting the DependencyResolver to use the NinjectDependencyResolverNinject.Web.Common 和 Ninject.Mvc 没有将 DependencyResolver 设置为使用 NinjectDependencyResolver
【发布时间】:2013-12-20 12:18:52
【问题描述】:

更新

开始赏金,我添加了一个复制 Ninject 错误的 Visual Studio 2010 解决方案,因为这似乎是一个相当本地化的问题。

Ninject VS 2010 Solution


当我执行以下操作时:

  1. 启动 Visual Studio 2010(是 2010 :-( )

  2. 文件 > 新项目 > 空 MVC 4 应用程序

  3. 管理包 > 安装包 Ninject.Web.Common(然后安装 Ninject 和 Ninject.Mvc)

  4. 然后在 HomeController 中执行以下操作

代码:

    public class HomeController : Controller
    {

        public HomeController(IKernel kernel)
        {
            // Should have been injected
        }
    }

我明白了:

Server Error in '/' Application.

No parameterless constructor defined for this object. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

 Exception Details: System.MissingMethodException: No parameterless constructor defined for this object.

Stack Trace: 

[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 'NinjectTest.Controllers.HomeController'. 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

当我查看DependencyResolver 是什么时,我看到了这个:

当我对 VS 2013 Express 实例执行相同操作并创建新的 MVC 4 空 Web 应用程序时,我看到 DependencyResolver 是 Ninject 的。

我确实有一个可运行的 VS 2010 解决方案,但所有外部文件存储站点都在我的工作场所被阻止,所以我稍后会链接它,如果在此期间有人有任何想法......

与此同时,我的解决方案是手动连接解析器,但我不应该这样做。

【问题讨论】:

  • 请不要打印您的例外情况,但请以文本形式包含完整的例外情况详细信息。这样更容易阅读,并允许您的问题被 Google 索引。这样其他人就可以从您的问题中受益。
  • 好点我会更新问题,谢谢。

标签: c# asp.net-mvc asp.net-mvc-4 ninject ninject.web.mvc


【解决方案1】:

您需要安装 Ninject.Mvc3 包,它是定义和设置依赖解析器的包。我可以在您上传的 VS2010 解决方案中看到未引用 Ninject.Web.Mvc.dll。安装该软件包也会安装 Ninject 和 Ninject.Web.Common,但不会反过来。

一旦您安装并引用了该软件包 (Ninject.Mvc3),您可能会在使用 MVC 4 时遇到与 here in this other question 相同的问题。确保 web.config 没有丢失 System.Web.Mvc 程序集从版本 3.0.0.0 到 4.0.0.0 的重定向。以下行会将任何版本的 System.Web.Mvc 重定向到版本 4.0.0.0:

<dependentAssembly>
    <assemblyIdentity name="System.Web.Mvc" publicKeyToken="31bf3856ad364e35" />
    <bindingRedirect oldVersion="0.0.0.0-4.0.0.0" newVersion="4.0.0.0" />
</dependentAssembly>

希望对你有帮助!

【讨论】:

  • 感谢您的回复,我没有发现我缺少 Ninject.Mvc3 包,我也尝试添加绑定重定向但无济于事。这些步骤对你有用吗?
  • 我已经尝试过在办公室安装的 VS2010 和 MVC 3。这很好用,但显然你正在尝试 MVC 4。我看到有这个问题的人(另一个 here)并且还注意到 Ninject.Web.Mvc has a reference 到 System.Web.Mvc 2.0.0.0。在 MVC 4 的情况下,该引用需要重定向到版本 4.0.0.0,所以这个问题是有道理的......
  • 只是为了仔细检查一下,您在哪里添加了程序集重定向?在主 web.config 的 runtime/assemblyBinding 节点内?
  • 再试一次,我想我一定是在开始解决方案后添加了 bindingredirect,我已经进行了重建,现在工作正常,感谢您发现我的错误!当我允许的时候,我会奖励你赏金。
  • 我也面临同样的问题。 MVC4 应用程序,Ninject.MVC3。 bindingRedirect 存在于 web.config 中。但是我仍然遇到同样的错误?
【解决方案2】:

您需要在 CreateKernel 方法中设置解析器。

    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestHttpModule));
        DynamicModuleUtility.RegisterModule(typeof(NinjectHttpModule));
        bootstrapper.Initialize(CreateKernel);
    }

创建内核方法:

    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        kernel.Bind<Func<IKernel>>().ToMethod(ctx => () => new Bootstrapper().Kernel);
        kernel.Bind<IHttpModule>().To<HttpApplicationInitializationHttpModule>();

        RegisterServices(kernel);
        DependencyResolver.SetResolver(new NinjectServiceLocator(kernel));

        return kernel;
    }

注册您的服务:

    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ITheService>().To<TheService>();
        //add other services, etc
    }

您可以从this nuget 获取 Ninject 依赖解析器。

希望这会有所帮助。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-04
  • 2019-10-29
  • 2011-07-04
  • 1970-01-01
  • 2011-08-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多