DI с MVC и пользовательским MembershipProvider - PullRequest
2 голосов
/ 06 февраля 2012

Я работаю над приложением ASP.NET MVC3, в котором есть специальный членство MembershipProvider для обработки аутентификации.Этот провайдер зависит от службы IUserService, которая устанавливается путем внедрения свойства.

public class MyMembershipProvider : MembershipProvider
{
    public IUserService UserService { get; set; }

    public override bool ValidateUser(string username, string password)
    {
        return UserService.IsValidLogon(username, password);
    }
}

Я использую Castle Windsor 3 для управления всем.При запуске приложения я успешно регистрирую провайдера членства:

protected void Application_Start()
{
    _container = new WindsorContainer().Install(FromAssembly.This());
    _container.Register(Component.For<MyMembershipProvider>().LifeStyle.Transient.Named("myProvider"));
}

, но при вызове провайдера я получаю исключение нулевой ссылки для свойства UserService.Как я могу сказать Касл Виндзору ввести мою собственность?

Ответы [ 3 ]

3 голосов
/ 06 февраля 2012

ASP.NET не делегирует создание поставщика членства третьим лицам (т. Е. Вы не можете DI the MembershipProvider). Это одна из болевых точек ASP.NET. Доступ к экземпляру MembershipProvider, созданному ASP.NET, можно получить через Membership.Provider . Вы можете сделать инъекцию свойства в этом.

1 голос
/ 06 февраля 2012

Я создал поставщика членства, который разделяет различные обязанности в меньших интерфейсах (что позволяет вам использовать DI). Это бесплатно и доступно как пакет nuget

http://blog.gauffin.org/2011/09/a-more-structured-membershipprovider/

0 голосов
/ 06 февраля 2012

Как указывает Eranga, вам придется вручную вводить свойство при первом доступе к MembershipProvider. Вы ничего не можете с этим поделать, так как MembershipProvider загружает свой экземпляр глубоко в недрах asp.net.

Однако я бы предложил, чтобы вы НЕ использовали внедрение зависимостей с этим. Так как членство провайдера является статическим классом. Он создается один раз для каждого приложения, и, таким образом, соединение остается открытым в течение всего срока службы пула приложений.

Для моего нестандартного провайдера я обычно просто обновляю свои экземпляры, чтобы можно было лучше поддерживать время жизни соединения. Это отстой, но я чувствую, что это лучше, чем оставлять висящее соединение, лежащее вокруг.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...