C# 找不到类型为';的ASP.NET MVC 4 Ninject MVC 4默认构造函数;应用控制器&x27;
我在Ubuntu14.04 LTS上的Xamarin Studio/monodevelop opt中设置了一个新的ASP.NET MVC 4应用程序(在IDE中运行时使用Mono 3.10.0 mod-Mono-server4/xsp)。安装的软件包包括: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
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
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());