Создание загрузчика в ASP.NET MVC 3 с использованием Ninject и DependencyResolver - PullRequest
0 голосов
/ 29 марта 2011

Я пытаюсь создать простой загрузчик. Мой код 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, поскольку оно уже имеет эту привязку и несколько других из коробки, как указано в ответах ниже.

Ответы [ 2 ]

1 голос
/ 29 марта 2011

См. https://github.com/ninject/ninject.web.mvc/wiki/Setting-up-an-MVC3-application о том, как правильно использовать Ninject.Extensions.MVC.Это добавит необходимые привязки.

0 голосов
/ 29 марта 2011

Не уверен насчет точно Ninject, но столкнулся с той же проблемой с другими контейнерами.

Похоже, контейнер принимает конструктор с параметром по умолчанию, пытается использовать автоматическое подключение, но не знает, что вставить ввместо RouteCollection.

Я бы попробовал:

  • Настроить регистрацию контейнера, чтобы использовать именно тот конструктор, который вам нужен (например, используя lambda, я уверен, что Ninject должен разрешитьдля таких регистраций, как kernel.Bind<IBootstrapperTask>().To(() => new RegisterRoutes()); или
  • (вероятно, лучше) Зарегистрируйте что-нибудь как RouteCollection. Id est - kernel.Bind<RouteCollection>().To(RouteTable.Routes). Обновление: , как говорит Римо, есть расширения MVC дляУкажите, где такая регистрация уже предоставляется «из коробки» (и, вероятно, большинство других, которые вам понадобятся). Итак, определенно идите по этому пути. Использование этих расширений для удобства - хорошая идея.
...