Я пытаюсь создать простой загрузчик. Мой код Boostrapper выглядит так:
public static void Run()
{
var tasks = DependencyResolver.Current.GetServices<IBootstrapperTask>();
foreach (var task in tasks)
{
task.Execute();
}
}
Интерфейс IBootstrapperTask выглядит следующим образом:
public interface IBootstrapperTask
{
void Execute();
}
Моей первой попыткой было зарегистрировать маршруты через загрузчик:
public class RegisterRoutes : IBootstrapperTask
{
private readonly RouteCollection routes;
public RegisterRoutes(RouteCollection routes)
{
this.routes = routes;
}
public RegisterRoutes() : this(RouteTable.Routes)
{
}
public void Execute()
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
routes.MapRoute("Default", "{controller}/{action}/{id}", new { controller = "Home", action = "Index", id = UrlParameter.Optional });
}
}
Мой global.asax выглядит так:
protected void Application_Start()
{
DependencyResolver.SetResolver(new NinjectDependencyResolver());
AreaRegistration.RegisterAllAreas();
RegisterGlobalFilters(GlobalFilters.Filters);
Bootstrapper.Run();
}
А мой NinjectDependencyResolver выглядит так:
kernel.Bind<IBootstrapperTask>().To<RegisterRoutes>();
Однако, когда я пытаюсь запустить этот код, я получаю следующее исключение:
Ошибка активации VirtualPathProvider
Соответствующие привязки недоступны, а тип не является самосвязываемым.
Путь активации:
3) Внедрение зависимости VirtualPathProvider в параметр virtualPathProvider конструктора типа RouteCollection
2) Внедрение зависимости RouteCollection в параметры маршрутов конструктора типа RegisterRoutes
1) Запрос на IBootstrapperTask
Любая помощь будет принята с благодарностью.
EDIT
Отсутствующая привязка, которая требовалась для работы моего примера, была:
kernel.Bind<RouteCollection>().ToConstant(RouteTable.Routes);
Эта привязка не понадобится, если вы используете расширение Ninject MVC, поскольку оно уже имеет эту привязку и несколько других из коробки, как указано в ответах ниже.