7
votes

Comment utiliser l'injection de dépendance et le motif de référentiel avec les services Web ASP.NET?

avec des pages régulières ASP.NET MVC, le référentiel est transmis au constructeur du contrôle. Ensuite, les tests peuvent instancier le contrôleur passer dans un référentiel simulé.

Comment puis-je faire cela avec des services Web? Le problème que je vois est que nous n'avons pas l'équivalent de contrôleurbuilder.setControllerFactory.

Quelles sont les meilleures pratiques pour obtenir mon cadre IOC (château) pour instancier mon service Web avec la mise en œuvre du référentiel correct?

Je pensais qu'il pourrait y avoir un moyen d'étendre httphandler et de changer la façon dont le service Web est réellement instancié. Je crois que c'est ainsi que le cadre MVC le fait.


2 commentaires

Quelle technologie utilisez-vous pour implémenter vos services Web? ASP.NET Web Services ou Fonds de Communication Windows?


Services Web ASP.NET. Cependant, après avoir lu la réponse de Jrista, je pense que cela vaut la peine d'examiner la WCF si je veux vraiment injecter des dépendances. Je envisage de simplement avoir deux constructeurs - une qui prend le référentiel comme des paramètres (les tests appelleront celui-ci) et une valeur par défaut qui sera dure du code: ceci (nouveau IRÉPOSITOIRE) et sera appelé par le cadre ASP.NET.


6 Réponses :


2
votes

C'est une bonne question. J'ai le même problème. Je pense que si vous créez des services Web à l'aide de fichiers .asmx, il est impossible d'utiliser l'injection de constructeur. Si vous utilisiez la WCF pour implémenter le service Web à la place, je pense que c'est possible.

Dans mon service Web .asmx, je laisse le conteneur DI définir les dépendances en définissant les propriétés. Comme ma candidature est également une application de formulaire Web ASP.NET, que je dois le faire, car je ne peux pas utiliser l'injection de constructeur sur des formulaires Web non plus. Mais j'utilise StructureMap, et il dispose d'une fonction pouvant définir des propriétés d'un objet déjà créé. Pas aussi propre que l'injection de constructeur, mais un bon compromis.

mais les services Web se différencient des formulaires Web, car je peux placer l'accumulation en dehors du formulaire Web, dans le Application_postmaprequestHandler événement. Mais je n'ai pas découvert un événement déclenché après la création de la classe de service Web. Ainsi, dans le constructeur de mon service Web, j'ai le code suivant xxx

et c'est un anti-modèle. Une classe initialisée par un conteneur DI ne doit pas savoir du conteneur DI lui-même. Mais je n'ai pas encore trouvé une meilleure solution.


0 commentaires

0
votes

Définissez une classe de base et utilisez une injection de propriété là-bas. Pete l'a déjà dit, mais vous feriez: objectfactory.buildup (this)

La différence est que je le mettrais sur une classe de base pour les services Web, de sorte que son "automatique" pour les implémentations spécifiques.

De cette façon, c'est une ligne, donc je ne m'en souciais pas à moins que vous n'ayez le besoin explicite de changer de conteneurs di à l'exécution (improbable). Si vous avez toujours besoin de cela, déplacez simplement l'appel vers une classe distincte qui utiliserait le conteneur DI spécifique.


0 commentaires

0
votes

Y a-t-il une raison pour laquelle vous ne pouvez pas créer une classe personnalisée avec le constructeur souhaité, puis instanciez un objet de cette classe dans votre asmx, puis déléguez toutes les actions à cet objet?

Je crée généralement ce genre d'objets comme Ceci: xxx


0 commentaires

0
votes

Quel type de services créez-vous? Si vous utilisez WCF, j'ai écrit ceci:

http://davidkiff.co.uk/post/2009/08/28/wcf-inversion-of-control-e2809CService-Constructore2809D-AND-Better-unit-testing!.aspx


0 commentaires

1
votes

Je pense que vous recherchez l'installation d'intégration de WCF du château Windsor WCF. Il fournit une mise en œuvre de services de service qui prend en charge le processus de construction de vos implémentations de service, en utilisant le CIO Windsor. Vous pouvez injecter des dépendances telles que toute autre application de la COI en utilisant cette installation et suffisamment facilement, sa part du projet de château:

http://www.castleproject.org/container/faciles /trunk/wcf/index.html

Si la version du projet du château ne fait pas ce dont vous avez besoin pour faire, j'ai mon propre établissement que j'ai créé pour faire la même chose pour Windsor avant de trouver la version du projet du château. Ils font généralement la même chose, mais ils s'approchent également le problème un peu différemment.


3 commentaires

Je suppose que la réponse est "Vous ne pouvez pas utiliser l'injection de constructeur avec ASP.NET Web Services", donc utilisez l'accumulation (ceci) ou utilisez WCF avec château.


En fait, vous devriez pouvoir utiliser le château Windsor avec des services de style ASMX (si c'est ce que vous voulez dire). Je pensais que tu demandais de la WCF, mais je ne vois pas pourquoi vous ne pouviez pas intégrer Windsor dans le pipeline ASMX. Ce n'est probablement pas aussi facile que possible avec WCF, mais cela ne devrait pas être impossible.


@jrista Etant donné que ServiceHost n'est pas autorisé dans le fichier ASMX, avez-vous un exemple sur la manière de mettre en œuvre DI pour les services ASMX?



0
votes

0 commentaires