5

Ich arbeitete ein wenig mit StructureMap und ich habe es geschafft, in meinem Controller (durch Konstruktorinjektion) ein konkretes Repository für eine Schnittstelle zu injizieren.In den benutzerdefinierten Mitgliedschaftsanbieter mit StructureMap injizieren

Jetzt muss ich einen Repository-Typ in meinen benutzerdefinierten Mitgliedschaftsanbieter injizieren. Aber wie? Mein benutzerdefinierter Mitgliedschaftsanbieter wird beispielsweise über Membership.Provider.ValidateUser erstellt.

Für Controller habe ich eine Klasse wie folgt:

public class IocControllerFactory : DefaultControllerFactory 
{ 
    protected override IController GetControllerInstance(
     System.Web.Routing.RequestContext requestContext, 
     Type controllerType) 
    { 
     return (Controller) 
      ObjectFactory.GetInstance(controllerType); 
    } 
} 

und in Global.asax, in Application_Start():

//... 
ObjectFactory.Initialize(x => 
{ 
    x.AddRegistry(new ArticleRegistry()); 
} 
            ); 


ControllerBuilder.Current.SetControllerFactory(
    new IocControllerFactory()); 
//... 

Aber wie ein konkreter in meiner benutzerdefinierten Mitgliedschaftsanbieter mit StructureMap injizieren?

+0

mögliche Duplikate von [Property-Injektion in benutzerdefinierte Mitgliedschaft Provider mit Castle] (http://StackOverflow.com/Questions/10174636/Eigenschaft-Injektion-in-Custom-Membership-Provider-using-castle) – Steven

Antwort

3

Es gibt keine Möglichkeit, in diesem Fall injizieren, denke ich.

Injection funktioniert nur, wenn die "Fabrik", die die Instanzen erstellt, benötigt, wissen über Injektion, und der Membership-Provider-Bereich zeigt leider sein Alter. Es war zurück codiert, wenn die Dinge anders gemacht wurden :).

Wenn Sie Ihre benutzerdefinierten Mitgliedschaftsanbieter mit ASP.NET MVC (Version 2 +) verwenden, können Sie bekommen, was Sie brauchen, um es von der DependencyResolver anfordernden etwa so:

DependencyResolver.Current.GetService<IRepository<User>>(); 

Oder Sie könnten wahrscheinlich Verwenden Sie ObjectFactory direkt.

+0

Ich verstehe nicht. Ich verwende dies in meinem benutzerdefinierten Mitgliedschaftsanbieter und schreibe nichts in und in Global.asax in Application_Start()? – Blocked

+0

Nein, Sie müssen Ihren benutzerdefinierten Dependency Resolver trotzdem in der Application_Start() oder in einer Bootstrap-Klasse wie DependencyResolver.SetResolver (new StructureMapDependencyResolver (container)) hinzufügen; Wo StructureMapDependencyResolver Ihre benutzerdefinierte Klasse und Ihr Container ist, ist Ihr StructureMap IContainer. mehr Infos hier: http://ericsowell.com/blog/2011/1/20/structymap-and-asp-net-mvc-3-getting-started – stephenbayer