Модель Ninject и Provider с конструктором без параметров

#asp.net-mvc-3 #c#-4.0 #dependency-injection #ninject-2

#asp.net-mvc-3 #c #-4.0 #внедрение зависимостей #ninject-2

Вопрос:

Я внедряю пользовательский RoleProvider и хотел бы использовать Ninject, однако я столкнулся с проблемой конструктора без параметров. Есть мысли о том, как внедрить для этого??

 public class EFRoleProvider:RoleProvider
{
    private readonly IRepository _repository;

    // I want to INJECT this GOO here!
    public EFRoleProvider()
    {
        IContextFactory contextFactory = new DbContextFactory<myEntities>();
        _repository = new RepositoryBase(contextFactory);

    }
}
  

Комментарии:

1. Этот пост может вас заинтересовать: blog.ploeh.dk/2011/04/27/ProviderIsNotAPattern.aspx

2. Отличный пост, так что в принципе я должен просто развернуть свой собственный интерфейс и реализацию и удалить XML поставщика из web.config, поскольку проблема с поставщиком вроде как хромает. Хорошо, вернемся к чертежной доске, ЛОЛ

Ответ №1:

Вы не можете внедрить что-то жестко запрограммированное. Извините. Ни один фреймворк DI не поддерживает это. В вашем конструкторе вы жестко закодировали экземпляр, так что это больше не инверсия управления. Чтобы выполнить инверсию управления, вам необходимо определить ваши слои как можно более слабо связанными:

 public class EFRoleProvider: RoleProvider
{
    private readonly IContextFactory _contextFactory;
    public EFRoleProvider(IContextFactory contextFactory)
    {
        _contextFactory = contextFactory;
    }
}
  

Теперь идите дальше и настройте свой DI framework.

Комментарии:

1. При выводе из RoleProvider у вас должен быть ctor без параметров. Вот где я сталкиваюсь с проблемой. Настройка моего DI не является проблемой 🙂 Параметризованный конструктор никогда не вызывается.

2. @Помощник помощника, да, действительно, RoleProvider — это наследие ASP.NET класс, для которого требуется конструктор без параметров, и AFAIK, в нем нет перехватов, позволяющих вам управлять его созданием. В качестве альтернативы вы могли бы извлекать зависимости из StandardKernel конструктора по умолчанию.

3. Да, в данный момент я изучаю, как это сделать с Ninject

4. @Помощник помощника в конструкторе: _repository = new StandardKernel().Get<IRepository>(); .

5. Что ж, это сработало не так, как ожидалось: Сообщение об ошибке синтаксического анализатора: Целью вызова было создано исключение. Это почти как если бы мои модули Ninject, которые прекрасно работают везде, были загружены в место, которое не может видеть этот технический директор RoleProvider.