Использование Ninject с Membership.Provider

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

У моего поставщика членства есть интерфейс репозитория. Он выглядит так:

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

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

private IRepository _repository;

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

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

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

Ответ 3

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

Ответ 4

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

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

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