C# 找不到类型为';的ASP.NET MVC 4 Ninject MVC 4默认构造函数;应用控制器&x27;

C# 找不到类型为';的ASP.NET MVC 4 Ninject MVC 4默认构造函数;应用控制器&x27;,c#,asp.net-mvc-4,mono,ninject,ioc-container,C#,Asp.net Mvc 4,Mono,Ninject,Ioc Container,我在Ubuntu14.04 LTS上的Xamarin Studio/monodevelop opt中设置了一个新的ASP.NET MVC 4应用程序(在IDE中运行时使用Mono 3.10.0 mod-Mono-server4/xsp)。安装的软件包包括: Install-Package Microsoft.AspNet.Mvc -Version 4.0.40804 Microsoft.AspNet.MVC Microsoft.AspNet.Razor Microsoft.AspNet.we

我在Ubuntu14.04 LTS上的Xamarin Studio/monodevelop opt中设置了一个新的ASP.NET MVC 4应用程序(在IDE中运行时使用Mono 3.10.0 mod-Mono-server4/xsp)。安装的软件包包括:

Install-Package Microsoft.AspNet.Mvc -Version 4.0.40804
  • Microsoft.AspNet.MVC
  • Microsoft.AspNet.Razor
  • Microsoft.AspNet.webpage
  • Microsoft.Web.Infrastructure
我还必须安装优化框架:

Install-Package Microsoft.AspNet.Web.Optimization
我选择从NuGet实现IoC容器Ninject,并安装了以下软件包:

Install-Package Ninject.Mvc4
  • 尼尼特
  • Ninject.MVC4
  • Ninject.Web.Common.WebHost
  • Ninject.Web.Common
因为我安装了Ninject.Mvc4,所以它在App_Start中为我创建了一个很好的文件,名为NinjectWebCommon.cs

以下是创建内核方法:

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

            RegisterServices (kernel);
            return kernel;
        } catch {
            kernel.Dispose ();
            throw;
        }
    }
这是我的~/Views/ResourceEntry/Index.cshtml文件:

@model App.Web.UI.ViewModels.ResourceEntryViewModel

<h1>Resource Page</h1>

想知道WebActivator与Mono之间是否存在问题。

查看堆栈跟踪,我可以在底部看到DefaultControllerFactory,它将在内部实例化控制器实例,例如:

return Activator.CreateInstance(YourControllerType);
这个调用会变得很糟糕,因为您的控制器没有无参数构造函数,并且您没有为它提供参数值列表以找到合适的构造函数来使用。。。因此有例外。 此外,您不希望提供参数列表,这将是不灵活的,并且会破坏IoC的目的,您希望您的IoC内核来创建实例

现在,我没有Ninject的经验,所以可能有一种更“Ninject”的方法来实现这一点(如果您知道这是什么,请添加到此:),但您需要创建自己的DefaultControllerFactory,它可以确定类型并使用Ninject来创建它。 大概是这样的:

// NOTE: Something like this, not exactly, I've not used Ninject!

public class YourControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        var type = GetControllerType(requestContext, controllerName);

        return kernel.Get(type);
    }
}
在Global.asax中注册:

ControllerBuilder.Current.SetControllerFactory(new YourControllerFactory());

现在您可以控制实例化过程了

ninject内核似乎未正确注册为
IDependencyResolver
。Ninject(从未)抛出带有消息“未找到默认构造函数”的
MissingMethodException
。还认为这是一个mono-ninject框架问题吗?或者我遗漏了什么/需要补充什么?对不起,我真的不知道。我将研究ninject.mvc如何将
IKernel
注册为
IDependencyResolver
,并调试/检查哪些不起作用。我不认为这是一个单声道的具体问题,但正如我所说的,我不知道。是的,这很奇怪,我遵循的架构与我发现的“洋葱架构”相同。它的演示项目编译并运行windows版本的Xamarin上的find。如果该演示项目不使用ninject,那么它是否运行良好并不重要。。。
System.MissingMethodException
Default constructor not found for type App.Web.UI.Controllers.ResourceEntryController

at System.Activator.CreateInstance (System.Type type, Boolean nonPublic) [0x00094] in /usr/src/packages/BUILD/mcs/class/corlib/System/Activator.cs:326 
at System.Activator.CreateInstance (System.Type type) [0x00000] in /usr/src/packages/BUILD/mcs/class/corlib/System/Activator.cs:222 
at System.Web.Mvc.DefaultControllerFactory+DefaultControllerActivator.Create (System.Web.Routing.RequestContext requestContext, System.Type controllerType) [0x00000] in <filename unknown>:0 

Version Information: 3.10.0 (tarball Sat Oct 4 16:28:24 UTC 2014); ASP.NET Version: 4.0.30319.17020
Powered by Mono
[assembly: WebActivator.PostApplicationStartMethod (typeof(App.Web.UI.App_Start.SimpleInjectorInitializer), "Initialize")]
return Activator.CreateInstance(YourControllerType);
// NOTE: Something like this, not exactly, I've not used Ninject!

public class YourControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        var type = GetControllerType(requestContext, controllerName);

        return kernel.Get(type);
    }
}
ControllerBuilder.Current.SetControllerFactory(new YourControllerFactory());