Asp.net mvc 3 需要Mono、ASP.NET MVC 3、Ninject和默认构造函数
我有一个正在工作的Visual Studio项目,我想用Mono和MonoDevelop运行o Mac。 该项目是一个带有Ninject MVC的ASP.NET MVC 3应用程序,它基本上在控制器上注入了一些接口实现 将所有ASP.NET MVC DLL和Ninject依赖项添加到项目后,它将成功编译。但当我运行它时,我有一个错误: 找不到WebActivatorTest.Controllers.HomeController类型的默认构造函数 我的控制器具有以下代码:Asp.net mvc 3 需要Mono、ASP.NET MVC 3、Ninject和默认构造函数,asp.net-mvc-3,mono,ninject,monodevelop,ninject.web.mvc,Asp.net Mvc 3,Mono,Ninject,Monodevelop,Ninject.web.mvc,我有一个正在工作的Visual Studio项目,我想用Mono和MonoDevelop运行o Mac。 该项目是一个带有Ninject MVC的ASP.NET MVC 3应用程序,它基本上在控制器上注入了一些接口实现 将所有ASP.NET MVC DLL和Ninject依赖项添加到项目后,它将成功编译。但当我运行它时,我有一个错误: 找不到WebActivatorTest.Controllers.HomeController类型的默认构造函数 我的控制器具有以下代码: public class
public class HomeController : Controller
{
INotifier _notifier;
public HomeController(INotifier notifier_)
{
_notifier = notifier_;
}
public ActionResult Index()
{
ViewBag.Name = _notifier.Person();
return View();
}
}
我不想有一个空构造函数,因为我现在有一个注册接口的AppStart代码:
private static void RegisterServices(IKernel kernel)
{
kernel.Bind<WebActivatorTest.Models.INotifier>().To<WebActivatorTest.Models.Notifier>();
}
私有静态无效注册服务(IKernel内核)
{
kernel.Bind().To();
}
此代码在Windows/VisualStudio上运行良好,但在Mono上不起作用。
有人能帮我吗
完全错误是:
Server Error in '/' Application
Default constructor not found for type WebActivatorTest.Controllers.HomeController.
Description: HTTP 500. Error processing request.
Stack Trace:
System.MissingMethodException: Default constructor not found for type WebActivatorTest.Controllers.HomeController.
at System.Activator.CreateInstance (System.Type type, Boolean nonPublic) [0x00000] in <filename unknown>:0
at System.Activator.CreateInstance (System.Type type) [0x00000] in <filename unknown>:0
at System.Web.Mvc.DefaultControllerFactory+DefaultControllerActivator.Create (System.Web.Routing.RequestContext requestContext, System.Type controllerType) [0x00000] in <filename unknown>:0
Version information: Mono Runtime Version: 2.10.9 (tarball Tue Mar 20 15:31:37 EDT 2012); ASP.NET Version: 4.0.30319.1
“/”应用程序中的服务器错误
找不到WebActivatorTest.Controllers.HomeController类型的默认构造函数。
描述:HTTP 500。处理请求时出错。
堆栈跟踪:
System.MissingMethodException:找不到WebActivatorTest.Controllers.HomeController类型的默认构造函数。
在:0中的System.Activator.CreateInstance(System.Type类型,布尔非公共)[0x00000]处
在0中的System.Activator.CreateInstance(System.Type类型)[0x00000]处
0中的System.Web.Mvc.DefaultControllerFactory+DefaultControllerActivator.Create(System.Web.Routing.RequestContext RequestContext,System.Type controllerType)[0x00000]处
版本信息:Mono运行时版本:2.10.9(tarball Tue Mar 20 15:31:37 EDT 2012);ASP.NET版本:4.0.30319.1
您可以添加默认构造函数
public HomeController()
{
}
但我认为,你错误地激活了控制器的Ninject。你需要注册一家工厂。确保Global.asax中的代码如下所示:
public class MvcApplication : NinjectHttpApplication
{
/// <summary>
/// Registers the global filters.
/// </summary>
/// <param name="filters">The filters.</param>
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
}
/// <summary>
/// Registers the routes.
/// </summary>
/// <param name="routes">The routes.</param>
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}
/// <summary>
/// Creates the kernel that will manage your application.
/// </summary>
/// <returns>The created kernel.</returns>
protected override IKernel CreateKernel()
{
var kernel = new StandardKernel();
kernel.Load(Assembly.GetExecutingAssembly());
return kernel;
}
/// <summary>
/// Called when the application is started.
/// </summary>
protected override void OnApplicationStarted()
{
base.OnApplicationStarted();
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);
}
}
public类mvcapapplication:NinjectHttpApplication
{
///
///注册全局筛选器。
///
///过滤器。
公共静态无效注册表全局过滤器(全局过滤器集合过滤器)
{
filters.Add(新HandleErrorAttribute());
}
///
///登记路线。
///
///路线。
公共静态无效注册表项(路由收集路由)
{
routes.IgnoreRoute(“{resource}.axd/{*pathInfo}”);
routes.MapRoute(
“默认值”,//路由名称
“{controller}/{action}/{id}”,//带参数的URL
新的{controller=“Home”,action=“Index”,id=urlparmeter.Optional});
}
///
///创建将管理应用程序的内核。
///
///创建的内核。
受保护的覆盖IKernel CreateKernel()
{
var kernel=新的标准内核();
Load(Assembly.getExecutionGassembly());
返回内核;
}
///
///在应用程序启动时调用。
///
Application Started()上受保护的覆盖无效
{
base.on应用程序启动();
RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
注册地址(RouteTable.Routes);
}
}
此外,例如,您可以在MVC3上看到示例代码,也可以使用for ninject,如详细所述
我想这对Mono会起作用。我来晚了一点,但这个解决方案帮了我的忙 重写默认构造函数:
public HomeController() : this(new Notifier())
{
}
public HomeController(INotifier notifier_)
{
_notifier = notifier_;
}
您使用的是哪种Mono版本?Ninject没有在例外情况中提及这一事实的可能重复[您没有发布]强烈表明MVC没有正确地了解您以及Ninject希望负责控制器创建的愿望。你找不到dup并且花了我很多时间才找到的原因是,你没有显示确切的异常消息-如果你以后记得添加关键细节,这会节省很多时间…没有重复的无参数构造函数…对不起,没有更清楚-AIUI有一个重复的问题(上面链接)-“我在MVC中使用Ninject,MVC告诉我需要一个无参数构造函数”我不想要一个空构造函数。我的Global.asax没有注册Ninject工厂。。。因为项目有一个AppStart/NinjectMV3.cs来完成这项工作。Ninject是与NuGet os Visual Studio一起安装的,后者是这样安装的。