Как MVC меняет конструкцию контроллера для использования при изменении этой строки кода на моем IOC (ninject)? - PullRequest
2 голосов
/ 21 января 2012

Я настроил ninject для моего проекта в файле global.asax ...

protected void Application_Start()
        {
            RegisterDependencyResolver();
            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }

        private void RegisterDependencyResolver()
        {
            var kernel = new StandardKernel();
            kernel.Bind<PteDotNetCore.IBlogManager>().To<PteDotNetCore.BlogManager>();
            DependencyResolver.SetResolver(new PteDotNet.Resolution.PteDotNetDependencyResolver(kernel));
        }

У меня есть контроллер с 2 константами ....

public CodeController()
        {

        }

        public CodeController(IBlogManager injectedManager)
        {
            manager = injectedManager;
        }

Когда я удаляю строку:

kernel.Bind<PteDotNetCore.IBlogManager>().To<PteDotNetCore.BlogManager>();

из первого блока кода мой конструктор по умолчанию используется при добавлении строки, затем используется конструктор, который принимает интерфейс.

Пожалуйста, может кто-нибудь сказать мне, какие решения MVC принимает для выбора конструктора? Это не совсем ясно.

Ответы [ 2 ]

3 голосов
/ 21 января 2012

Решение на самом деле принимается девяткой. Для инжектора конструктора он выбирает тот, у которого больше всего параметров, см. Вики для получения подробной информации о том, как это работает

https://github.com/ninject/ninject/wiki/Injection-Patterns/1e462388cee1887a4bb90067cf334d91604f7ea8

1 голос
/ 21 января 2012

Контроллеры построены с использованием фабрики контроллеров.Установив DependencyResolver, вы говорите MVC использовать ваш контейнер IoC для создания контроллеров.

По умолчанию IoC отсутствует, и поэтому будут использоваться конструкторы по умолчанию без аргументов.

При наличии контейнера IoC (Ninject) фабрика контроллеров видит, что у конструкторов контроллеров есть аргументы.Он будет смотреть в вашем контейнере IoC, чтобы разрешить эти зависимости и передать экземпляры конструкторам arg.

...