Подтвердить что ты не робот

Как интегрировать поставщика членства IoC с ASP.NET MVC

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

Мой провайдер реализован с использованием дизайна инъекций IoC/dependency. Поставщик предоставляет дополнительную функциональность за базовым 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);
    }

Все это отлично работает в моем коде С#, но я хочу подключить своего провайдера к 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>
4b9b3361

Ответ 1

Самый простой способ заставить это работать - использовать стандартный механизм ASP.NET <membership> в web.config. Вы просто разрешите использовать конструктор по умолчанию , но переопределите Initialize() и потяните туда зависимости. Используйте this в качестве ссылки.

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

Недавно я писал о решении сделать правильный IoC с MembershipProviders.