Вставьте MembershipProvider в ASP.NET MVC AccountController - PullRequest
7 голосов
/ 29 мая 2009

Шаблоны проектов ASP.NET MVC 1.0 включают класс AccountController, который поддерживает внедрение конструктора:

public AccountController(IFormsAuthentication formsAuth, 
    IMembershipService service)
{
    FormsAuth = formsAuth ?? new FormsAuthenticationService();
    MembershipService = service ?? new AccountMembershipService();
}

Также включен класс AccountMembershipService, который также поддерживает внедрение конструктора:

public AccountMembershipService(MembershipProvider provider)
{
    _provider = provider ?? Membership.Provider;
}

Я уверен, что многие из вас использовали их для модульного тестирования, но моя цель - внедрить SqlMembershipProvider с помощью Windsor и, таким образом, настроить его во время выполнения, используя XML-файлы Windsor, а не web.config. Другими словами, Я хочу использовать инжекцию конструктора для AccountMembershipService класса , и я хочу продолжать использовать встроенную систему членства ASP.NET 2.0. Я просто хочу, чтобы конфигурация системы членства проходила через Windsor IoC.

Возможно ли это без написания моего собственного MembershipProvider или SqlMembershipProvider не очень хорошо работает с IoC?

Из MSDN : «ASP.NET вызывает конструктор SqlMembershipProvider для создания экземпляра класса SqlMembershipProvider, как указано в конфигурации для приложения. Этот конструктор не предназначен для использования из вашего кода . "

Мне кажется, Фил задал очень похожий вопрос , вот ответов , которые он получил.

Спасибо за вашу помощь. <Ч /> UPDATE: Просто чтобы быть понятным, моя причина для поддержки приложения MembershipProvider через DI заключается в поддержке нескольких арендаторов. Каждый арендатор имеет изолированную базу данных с таблицами членства ASP . DI позволяет мне переключать строки подключения во время выполнения и, таким образом, сохранять независимость основного приложения от того, какая база данных используется для каждого арендатора. Виндзор контролирует DI и «знает», какой арендатор делает запрос через URL:

var url = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]

Майк Хэдлоу пишет об этой технике . Я просто пытаюсь интегрировать SqlMembershipProvider в его использование этого дизайна IoC.

1 Ответ

3 голосов
/ 29 мая 2009

Предполагая, что ваши провайдеры членства настроили что-то вроде этого:

<membership>
    <providers>
        <clear/>
        <add name="www.tenant1.com" 
         type="System.Web.Security.SqlMembershipProvider, ..." 
         .../>
        <add name="www.tenant2.com" 
         type="System.Web.Security.SqlMembershipProvider, ..." 
         .../>
    </providers>
</membership>

вы можете сделать так, чтобы Виндзор выбрал подходящего провайдера следующим образом:

var container = new WindsorContainer();
container.AddFacility<FactorySupportFacility>();
container.Register(Component.For<MembershipProvider>()
    .LifeStyle.Transient
    .UsingFactoryMethod(() => Membership.Providers[HttpContext.Current.Request.Url.Host]));
... (your controller registrations, etc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...