Использование Ninject с Membership.Provider - PullRequest
12 голосов
/ 08 ноября 2010

Я новичок в 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?

Ответы [ 4 ]

10 голосов
/ 23 апреля 2012

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

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

IUserService _userService = DependencyResolver.Current.GetService<IUserService>();
9 голосов
/ 28 января 2011

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

private IRepository _repository;

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

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

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

5 голосов
/ 08 ноября 2010

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

0 голосов
/ 08 ноября 2010

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

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

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

...