Ninject MVCはMVC 2プレビューで動作するはずですか?
-
10-07-2019 - |
質問
MVC 2プレビューを実行していますが、Ninject2 MVCを使用するのは初めてです
私が大陸で得ているエラーがあります: 「MyMVC.Controllers.EventsController」タイプのコントローラーを作成しようとしたときにエラーが発生しました。コントローラーにパラメーターなしのパブリックコンストラクターがあることを確認してください。
Global.csにあるのはこれです:
public class MvcApplication : NinjectHttpApplication
{
public static void RegisterRoutes(RouteCollection routes)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.IgnoreRoute("elmah.axd");
routes.MapRoute(
"Default", // Route name
"{controller}/{action}/{id}", // URL with parameters
new { controller = "Home", action = "Index", id = "" } // Parameter defaults
);
routes.MapRoute(
"Root",
"",
new { controller = "Home", action = "Index", id = "" }
);
}
protected override void OnApplicationStarted()
{
RegisterRoutes(RouteTable.Routes);
RegisterAllControllersIn(Assembly.GetExecutingAssembly());
}
protected override IKernel CreateKernel()
{
return new StandardKernel(new ServiceModule());
}
}
internal class ServiceModule : NinjectModule
{
public override void Load()
{
Bind<IEventService>().To<EventService>();
Bind<IEventRepository>().To<EventRepository>();
}
}
そして、これが私のコントローラーの外観です。
public class EventsController : Controller
{
private IEventService _eventService;
//
// GET: /Events/
public EventsController(IEventService eventService)
{
_eventService = eventService;
}
public ActionResult Index(string name)
{
return View(_eventService.GetEvent(name));
}
public ActionResult UpcomingEvents()
{
return View(_eventService.GetUpcomingEvents().Take(3).ToList());
}
}
解決
Ninjectは使用していませんが、独自のIControllerFactoryを実装する必要があると思います。 MVC 2に更新するまで、RegisterAllControllersIn(..)の代わりにそれを利用します。
ControllerBuilder.Current.SetControllerFactory(new MyNinjectControllerFactory());
編集:繰り返しますが、私はNinjectに精通しているわけではありませんが、これはシンプルファクトリーとして機能する可能性があります:
public class MyNinjectControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(Type controllerType)
{
return [Container].GetInstance(controllerType) as Controller;
}
}
他のヒント
明白なことを述べるリスクがあるので、イベントコントローラーにパラメーターなしのコンストラクターを追加してみてください。
public class EventsController : Controller
{
private IEventService _eventService;
//
// Parameterless constructor, so NInject will work
public EventsController() {}
//
// Regular constructor
public EventsController(IEventService eventService)
{
_eventService = eventService;
}
所属していません StackOverflow