2013-12-20 17 views
3

UPDATENinject.Web.Common和Ninject.Mvc沒有設置DependencyResolver使用NinjectDependencyResolver

開始賞金,我加入了一個Visual Studio 2010中的解決方案複製Ninject錯誤,因爲這似乎是一個相當本地化的問題。

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是什麼時,我看到這個:

enter image description here

當我做同樣的用VS 2013 Express實例,並創建一個新的MVC 4個空的Web應用程序我看到DependencyResolver是Ninject之一。

我有一個可運行的VS 2010解決方案,但所有外部文件存儲網站都在我的工作受阻,所以我將其鏈接後,如果有人在此期間的任何想法....

我的解決方案同時手動連接解析器,但我不應該這樣做。

+1

請不要製作您的例外的打印屏幕,但包括完整的例外細節作爲文本。這樣可以更輕鬆地閱讀並允許您的問題被Google編入索引。這樣其他人可以從你的問題中受益。 – Steven

+1

好點我會更新問題,謝謝。 – SimonGates

回答

2

您需要安裝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> 

希望它有幫助!

+0

感謝您的回覆,我沒有發現我錯過了Ninject.Mvc3軟件包,我也嘗試添加綁定重定向但無濟於事。這些步驟是否適合你? – SimonGates

+0

我已經嘗試過VS2010和MVC 3,這是我在辦公室安裝的。這很好,但顯然你正在嘗試MVC 4.我看到有人遇到這個問題(另一個[這裏](http://stackoverflow.com/questions/12311479/asp-net-mvc-4-ninject-mvc-3- no-parameterless-constructor-defined-for-this-ob))並且還注意到Ninject.Web.Mvc [有一個引用](https://github.com/ninject/ninject.web.mvc/blob/master/ mvc3/src/Ninject.Web.Mvc/Ninject.Web.Mvc.csproj)到System.Web.Mvc 2.0.0.0。在MVC 4的情況下,該引用需要重定向到4.0.0.0,因此問題有意義... –

+0

只需要仔細檢查,您在哪裏添加了程序集重定向?在主web.config的'runtime/assemblyBinding'節點內部? –

0

您需要在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依賴解析器。

希望這會有所幫助。

+0

感謝您的回覆,但我相信這是在NinjectMvcHttpApplicationPlugin中完成的,它位於Ninject.Mvc Nuget包中,請參閱此鏈接https://github.com/ninject/ninject.web.mvc/blob/master/mvc3/src /Ninject.Web.Mvc/NinjectMvcHttpApplicationPlugin.cs#L55 – SimonGates

+0

這是正確的,我使用NinjectServiceLocator的非官方版本。 – lopezbertoni