6

J'ai rencontré un problème plutôt poilu. Il y a probablement une solution simple à cela mais je ne peux pas le trouver!Constructeur/Setter Injection utilisant IoC dans HttpHandler, est-ce possible?

J'ai un HttpHandler personnalisé que je veux traiter une demande, consigner certaines informations puis entrer les détails dans la base de données. J'utilise NUnit et Castle Windsor.

J'ai donc deux interfaces; un pour enregistrer l'autre pour l'entrée de données, qui sont injectés par le constructeur. J'ai rapidement découvert qu'il n'y a aucun moyen d'appeler le constructeur car le constructeur par défaut sans défaut est toujours appelé à la place.

Alors j'ai pensé que j'utiliserais l'injection de Setter et laisserai Castle windsor le trier. Cela fonctionne réellement comme quand j'utilise container.Resolve<CustomHttpHandler>(); je peux vérifier que l'enregistreur n'est pas nul. (Dans Application_Start in Global.asax.cs)

Le problème est que Castle Windsor peut créer l'instance que l'application http ne l'utilise pas ??? Je pense?? Fondamentalement, la raison principale de cette façon de faire était de pouvoir tester le code de l'enregistreur et du référentiel de données de manière isolée par des tests de simulation et d'unité.

Des idées comment je peux résoudre ce problème?

Merci!

+0

Matt, ce n'est pas cool de changer ta question comme ça parce que tu invalides toutes les réponses existantes et que tu force tout le monde à se mettre à jour. Veuillez annuler votre modification et créer une nouvelle question à la place. –

+0

Salut Mauricio. Désolé, évidemment, je suis nouveau à comment cela fonctionne. Avoir retourné et créé une nouvelle question. Merci! – Matt

Répondre

2

Pas possible, du moins pas directement. Les objets IHttpHandler sont instanciés par le runtime ASP.NET et ne permettent pas à Windsor de s'impliquer dans sa création. Vous pouvez:

  • Extraire les dépendances en utilisant le conteneur comme localisateur de service.
  • Mettre en place un gestionnaire de base qui crée, injectent et délégués à vos propres gestionnaires (voir comment Spring does it)
  • Utilisez le récipient comme un localisateur de services pour un autre service qui gère toute la demande (comme saret explained)
+0

Dang, j'avais le sentiment que ça pourrait être le cas. Pourriez-vous expliquer un peu votre premier point: Pull dépendances, en utilisant le conteneur comme un localisateur de service. Merci! – Matt

+0

@Matt: à partir de votre HttpHandler, appelez le conteneur pour récupérer les dépendances dont vous avez besoin. –

+0

Merci pour la réponse Mauricio. Compris! – Matt

2

Ce que vous pouvez faire est de faire appel à HttpHandler à un autre objet qui gère réellement la requête. donc dans la méthode ProcessRequest de votre HttpHandler vous feriez quelque chose comme ceci:

public void ProcessRequest(HttpContext context) 
{ 
var myHandlerObject = container.Resolve<HandlerObject>(); 
myHandlerObject.ProcessRequest(context or some state/info that is required) 
} 
+0

Bonjour. Merci pour l'idée. Cela pourrait être la solution, l'une des autres options Mauricio. Merci! – Matt