#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.