Шаблоны проектов 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 и, таким образом, настроить его во время выполнения с использованием файлов Windsor XML, а не web.config. Другими словами, я хочу использовать внедрение конструктора для класса AccountMembershipService
, и я хочу продолжать использовать встроенную систему членства ASP.NET 2.0. Я просто хочу, чтобы конфигурация системы членства проходила через Windsor IoC.
Возможно ли это без написания моего собственного MembershipProvider, или SqlMembershipProvider
плохо работает с IoC?
Из MSDN: " Конструктор SqlMembershipProvider вызывается ASP.NET для создания экземпляра класса SqlMembershipProvider, как указано в конфигурации приложения. Этот конструктор не предназначен для использования из вашего кода. "
Я считаю, что Фил задал очень похожий вопрос., вот ответы он получил.
Thanks for your help.
UPDATE: Just to be clear, my reason for suppling the application's MembershipProvider via DI is to support multiple tenants. Each tenant has an isolated database with ASP membership tables. DI allows me to switch connection strings at runtime and thus keep the core application agnostic about which database is being used for each tenant. Windsor is controlling the DI and it "knows" which tenant makes the request via url:
var url = HttpContext.Current.Request.ServerVariables["HTTP_HOST"]
Майк Хэдлоу пишет об этой технике . Я просто пытаюсь интегрировать SqlMembershipProvider
в его использование этого дизайна IoC.