2012-04-03 2 views
1

У меня есть рабочий проект Visual Studio, который я хочу запустить o Mac с Mono и MonoDevelop. Проект представляет собой приложение ASP.NET MVC 3 с Ninject MVC, которое в основном вводит на контроллер некоторые реализации интерфейса.Моно, ASP.NET MVC 3, Ninject и требуемый конструктор по умолчанию

После добавления всех проектов ASP.NET MVC dll и зависимостей Ninject к проекту он успешно компилируется. Но когда я иду запустить его, у меня есть ошибка:

Конструктор по умолчанию не найден для типа WebActivatorTest.Controllers.HomeController.

Мой контроллер имеет следующий код:

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>(); 
} 

Этот код прекрасно работает на Windows,/Visual Studio, но не работает в 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 
+0

Что Mono версии вы используете? – skolima

+0

Возможный дубликат [Без объекта конструктора без параметрирования] (http://stackoverflow.com/questions/9916012/no-parameterless-constructor-object-defined) –

+0

Тот факт, что Ninject не упоминается в исключении [что вы не опубликовали] stronly предполагает, что MVC не был правильно проинформирован о вас и о желании Ninject взять на себя ответственность за создание контроллера. Причина, по которой вы не находите дуп, и мне потребовалось много времени, чтобы найти одно - это то, что вы не указали точное сообщение об исключении - это экономит много времени, если вы cna remeber, чтобы добавить эту ключевую деталь в будущем ... –

ответ

0

вы можете добавить конструктор

public HomeController() 
{ 
} 

по умолчанию Но я думаю, что вы неправильно активировать Ninject для контроллеров. Вам нужна регистрация ninject factory. Убедитесь, что ваш код в 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); 
     } 
    } 

Кроме того, примеры вы можете увидеть пример кода на MVC3 here

+0

Я не хочу иметь пустой конструктор. – lthomaz

+0

My Global.asax не регистрирует Ninject Factory ... потому что проект имеет AppStart/NinjectMV3.cs, который выполняет эту работу. Ninject был установлен с NuGet os Visual Studio, который устанавливает его так. – lthomaz

0

Или вы могли бы использовать для MVC extensions Ninject, как подробно описано here

Я предполагаю, что это будет работать с Mono

0

Я немного опаздываю на вечеринку, но это решение мне помогло.

Override конструктор по умолчанию:

public HomeController() : this(new Notifier()) 
{ 

} 

public HomeController(INotifier notifier_) 
{ 
    _notifier = notifier_; 
} 

Смежные вопросы