So integrieren Sie den IoC-Mitgliedschaftsanbieter in ASP.NET MVC

Ich habe einen benutzerdefinierten Mitgliedschafts- / Rollenanbieter, den ich in meinen MVC-Controllern verwende und auf den ich auch mit ASP.NET MVC zugreifen möchte, damit ich AuthorizationFilters usw. verwenden kann. Da so viele Benutzer benutzerdefinierte Anbieter implementiert haben, können sich viele Benutzer das vorstellen Dies, aber ich habe es nicht herausgefunden oder Postings gefunden, die dieses Problem speziell ansprechen.Dieser Beitrag ist eine Art Kehrseite meiner Frage. In meinem Fall funktioniert mein benutzerdefinierter Anbieter gut mit meinen Controllern, und ich möchte, dass MVC ihn auch verwendet.

Mein Provider ist mit einem IoC / Dependency Injection Design implementiert. Der Anbieter stellt zusätzliche Funktionen zur Verfügung, die über die API für Basismitgliedschaften / -rollen hinausgehen. In meinen Controllern verwende ich Castle Windsor, um Instanzen zu erstellen. Der Code sieht ungefähr so ​​aus:

<code>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);
    }
</code>

Dies funktioniert in meinem C # -Code sehr gut, aber ich möchte meinen Provider mit MVC verbinden, um [Authorize] -Filter damit zu verwenden:

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

Ich weiß, dass die übliche Methode, ASP.NET über einen benutzerdefinierten Mitgliedschafts- oder Rollenanbieter zu informieren, in der Datei "web.config" (siehe unten) ist. In diesem Fall versucht ASP.NET jedoch nur, den Standardkonstruktor aufzurufen, was nicht funktioniert. Jede Hilfe dankbar.

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

Antworten auf die Frage(1)

Ihre Antwort auf die Frage