2010-11-08 2 views
11

Я новичок в Ninject, и у меня возникают проблемы с его использованием с пользовательским поставщиком членства.Использование Ninject с Membership.Provider

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

public class CustomMembershipProvider : MembershipProvider 
{ 
    public CustomMembershipProvider(IRepository repository) 
    { 
    } 
} 

Я использую код вот часть модели учетной записи в приложении MVC в качестве отправной точки.

Однако, когда он называет Membership.Provider, я получаю сообщение об ошибке No parameterless constructor defined for this object.

Я установил привязки в ninject, чтобы связать IRepository с классом Repository, которые работают, поскольку я тестировал это в контроллере.

Каковы правильные привязки в Ninject для использования в Membership.Provider?

+0

просмотрите ответы и наградить лучших вариантов, если вы можете – mare

ответ

9

Это то, как это должно быть сделано сегодня с новыми версиями как MVC и Ninject (версия 3):

У вас есть доступ к экземпляру DependencyResolver и Ninject устанавливает себя в качестве текущего DependencyResolver. Таким образом, вам не нужны хаки, чтобы получить доступ к статическому ядру Ninject. Обратите внимание, что мой пример использует свой собственный репозиторий IUserService для членства ...

IUserService _userService = DependencyResolver.Current.GetService<IUserService>(); 
+0

Как вы это делаете в WebForms вместо MVC? – Tom

+0

Это лучшее решение, чем прямое использование ядра ninject. – kaptan

+0

Огромное спасибо! –

0

Я еще не использовал Ninject. но в StructureMap я установить эту зависимость:

expression.For<MembershipProvider>().Add(System.Web.Security.Membership.Provider); 

и она отлично работает.

+2

Это не дает ответа на вопрос. Он спрашивает, как создать экземпляр поставщика, а не как ввести поставщика в нечто другое. –

5

Поскольку коллекция членства и экземпляр Membership.Provider создаются до того, как Ninject может их создать, вам необходимо выполнить активацию после создания объекта. Если вы помечаете свои зависимости [Inject] для своих свойств в своем классе провайдера, вы можете позвонить kernel.Inject(Membership.Provider) - это назначит все зависимости вашим свойствам.

+0

Одна из причин этого заключается в том, что она создает зависимость Ninject от поставщика. Не огромная сделка, но если ваш провайдер является частью библиотеки, которая должна иметь как можно меньше внешних зависимостей, тогда это не весело. – crush

9

Лучшее решение, которое я нашел, было следующее:

private IRepository _repository; 

[Inject] 
public IRepository Repository 
{ 
    get { return _repository; } 
    set { _repository= value; } 
} 

public CustomMembershipProvider() 
{ 
    NinjectHelper.Kernel.Inject(this); 
} 

Где NinjectHelper статический вспомогательный класс, чтобы получить Kernal от.

+4

Что такое NinjectHelper? Я не могу найти его. Нужно ли создавать его самостоятельно? – Tomas

+0

+1 для использования атрибута, но не для использования «помощника». Здесь вы используете антипаттерн Service Locator (вроде). Вы можете вызвать метод «Inject» в WebActivator.PostApplicationStartMethod –

Смежные вопросы