Вопрос по dependency-injection, asp.net-membership, asp.net-mvc – Как интегрировать поставщика членства IoC с ASP.NET MVC

18

У меня есть пользовательский поставщик членства / ролей, который я использую в своих контроллерах MVC, и я также хочу, чтобы он был доступен для ASP.NET MVC, чтобы я мог использовать AuthorizationFilters и т. Д. Поскольку многие люди реализовали пользовательские поставщики, я думаю, что многие сделали это, но я не разобрался в этом или не нашел сообщений, которые конкретно касаются этой проблемы.Эта почта это своего рода обратная сторона моего вопроса. В моем случае мой пользовательский провайдер хорошо работает с моими контроллерами, и я хочу, чтобы MVC тоже использовал его.

Мой провайдер реализован с IoC / конструкцией внедрения зависимостей. Поставщик предоставляет дополнительные функциональные возможности помимо базового API членства / ролей. В моих контроллерах я использую Castle Windsor для создания экземпляров. Код выглядит примерно так:

public class HomeController : Controller {
    IMembershipService _membershipService;
    public HomeController(IMembershipService membershipService) {
        _membershipService= membershipService;
    }
}

<castle>
 <components>
  <component id="MembershipService" 
             service="IMembershipService, MyApp" 
             type="MembershipService, MyApp" lifestyle="PerWebRequest">
    <parameters>
      <connectionString>#{defaultConnectionString}</connectionString>
    </parameters>
  </component>
 </components>
</castle>

public class WindsorControllerFactory : DefaultControllerFactory {
    private WindsorContainer _container;
    public WindsorControllerFactory() {
        _container = new WindsorContainer(new XmlInterpreter(new ConfigResource("castle")));

        List<Type> controllerTypes = new List<Type>();
        foreach (Type t in Assembly.GetExecutingAssembly().GetTypes()) {
            if (typeof(IController).IsAssignableFrom(t))
                controllerTypes.Add(t);
        }

        foreach (Type t in controllerTypes) {
            // LifestyleType.Transient = new controller instance for each request
            _container.AddComponentLifeStyle(t.FullName, t, LifestyleType.Transient);
        }
    }

    protected override IController GetControllerInstance(Type controllerType) {
        return (IController)_container.Resolve(controllerType);
    }

Все это прекрасно работает в моем коде на C #, но я хочу подключить моего провайдера к MVC, чтобы использовать с ним фильтры [Authorize]:

[Authorize (Users="user1, user2", Roles="role8")]
public ViewResult MyResult(int x) {
    // implement
}

Я знаю, что обычный способ сообщить ASP.NET о настраиваемом поставщике членства или ролей в файле web.config, как показано ниже, но если я сделаю это, ASP.NET просто попытается вызвать конструктор по умолчанию, который не сработает. Любая помощь приветствуется.

<membership>
 <providers>
  <clear/>
  <add name="MyMembershipProvider" type="MyMembershipProvider">
 </providers>
</membership>

Ваш Ответ

1   ответ
24

механизм ASP.NET<membership> в web.config. Вы просто позволяете ему использовать конструктор по умолчаниюbut вы переопределяете Initialize () иpull зависимости там. использованиеэтот как ссылки.

Лично из-за подобных вещей я предпочитаю вообще избегать модель провайдера, поэтому использую подход, аналогичныйописано в документации MonoRail, ИМХО, он менее раздутый и более гибкий. В конце концов, это просто настройкаHttpContext.User с надлежащимIPrincipal реализация, которую использует AuthorizeAttribute.

Я недавнонаписал в блоге о решении сделать правильный IoC с MembershipProviders.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded keithm

Похожие вопросы