Использование 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);
и он отлично работает.