2010-05-09 7 views
0

J'utilisais AspNetSqlMembershipProvider par défaut dans mon application. L'authentification est effectuée via un AuthenticationService (puisque je supporte également d'autres formes d'adhésion comme OpenID).ASP.NET MembershipProvider et StructureMap

Mon AuthenticationService prend un MembershipProvider comme paramètre constructeur et j'injectait la dépendance à l'aide StructureMap comme ceci:

For<MembershipProvider>().Use(Membership.Provider); 

Cela utilisera le MembershipProvider configuré dans web.config. Tout cela fonctionne très bien.

Cependant, maintenant j'ai roulé mon propre MembershipProvider qui utilise une classe de référentiel. Étant donné que le MembershipProvider est pas exactement IoC amical, j'ai ajouté le code suivant à la méthode MembershipProvider.Initialize:

_membershipRepository = ObjectFactory.GetInstance<IMembershipRepository>(); 

Cependant, cela soulève une exception, comme StructureMap n'a pas été initialisé (ne peut pas obtenir instance de IMembershipRepository) . Toutefois, si je supprime le code et place des points d'arrêt à la méthode initialize de mon MembershipProvider et à mon bootstrappeur StructureMap, il semble-t-il que StructureMap est configuré avant l'initialisation de MembershipProvider. Ma seule solution de contournement jusqu'à présent consiste à ajouter le code ci-dessus à chaque méthode dans le MembershipProvider qui a besoin du référentiel. Cela fonctionne bien, mais je suis curieux de savoir pourquoi je ne peux pas obtenir mon instance dans la méthode Initialize. Le MembershipProvider effectue-t-il une initialisation interne qui s'exécute avant que mon propre code d'application ne le fasse?

Merci Ben

Répondre

2

Oui, le fournisseur est initialisé par le moteur d'exécution ASP.Net lorsque le AppDomain est filé jusqu'à, bien avant toute exécution de votre code.

Vous aurez besoin de choisir un autre point pour faire votre composition, peut-être dans Global.Application _ ???.

+0

Merci pour la réponse. Je pense que je continuerai à obtenir mes instances dans chaque méthode de fournisseur d'adhésion, plutôt que de changer mon point de composition - comme tout le reste fonctionne bien - peut-être que nous obtiendrons des fournisseurs sympathiques DI dans .NET 5 :) –

+0

Dans mon expérience, la méthode Initialize d'un fournisseur de membres est appelé après app_start a viré, donc IoC-permettre un fournisseur d'adhésion n'est pas si difficile. D'autre part, les fournisseurs de HealthMonitoring ... leur méthode initialize semble être appelée avant app_start, ce qui fait qu'ils présentent des défis intéressants. –