Пользовательский поставщик ролей, использующий DI-ошибку - PullRequest
4 голосов
/ 24 ноября 2011

Я настраиваю CustomRoleProver как:

public class CustomRoleProvider : RoleProvider
    {
        private readonly IRepository<User> _repository;

        public CustomRoleProvider(IRepository<User> repository)
        {
            _repository = repository;
        }

...

В моем Global.asax.cs у меня есть:

//Create Ninject DI kernel
            var kernel = new StandardKernel();

            kernel.Bind<IRepository<User>>().To<Repository<User>>();

            //Tell ASP.NET MVC 3 to use our Ninject DI Container
            DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));

Когда я пытаюсь запустить свой код, я получаю:

Ошибка конфигурации Описание: во время обработки файла конфигурации, необходимого для обслуживания этого запроса, произошла ошибка.Пожалуйста, просмотрите подробности конкретной ошибки ниже и измените файл конфигурации соответствующим образом.

Сообщение об ошибке синтаксического анализатора: для этого объекта не определен конструктор без параметров.

Ошибка источника:

Строка 64:Строка 65: Строка 66: Строка 67: Строка 68:

Так что, возможно, у меня совершенно неправильное понимание DI и ниндзя.Я думал, что когда он попытается создать экземпляр CustomRoleProvider, он создаст хранилище пользователя и передаст его конструктору, не пытающемуся использовать безпараметрический.

Я правильно понимаю или мои настройки просто неверны?

Я нахожу это странным, потому что DI, кажется, в основном работает для контроллеров.

Ответы [ 3 ]

4 голосов
/ 04 декабря 2011

Вы пишете ролевой провайдер, но в настоящее время он не знает DI.Многие классы в MVC осведомлены о DI, поэтому вы видите, что он работает с контроллерами.

Чтобы иметь возможность ввести параметр конструктора, контейнер DI должен отвечать за создание объекта, на который вы надеетесьвпрыскивать в.Просто регистрация типа магически не делает его локализуемым.

С помощью roleproviders именно класс Roles в структуре создает экземпляры поставщиков, включая вашего настраиваемого поставщика.Работает только без параметров.Вам нужно будет использовать что-то вроде внедрения свойства в вашем пользовательском провайдере и использовать Roles.Provider, чтобы заставить экземпляр внедрять ваши зависимости.

0 голосов
/ 24 ноября 2011

Скорее всего, вы используете неверный пользовательский преобразователь зависимостей.Прочитайте https://github.com/ninject/ninject.web.mvc/wiki/MVC3 о том, как использовать вместо этого расширение Ninject.MVC3.

0 голосов
/ 24 ноября 2011

Чтобы настроить Ninject лично, я бы создал класс фабрики в вашем проекте, как показано ниже.

Обратите внимание, метод AddBindings, где вы настраиваете привязки DI.фабрика в Application_Start файла Global.asax.cs:

ControllerBuilder.Current.SetControllerFactory(new NinjectControllerFactory());
...