Notre équipe a construit une application DDD qui a une couche de service d'application fortement définie qui est construite comme "l'API" du système. Il gère l'ensemble du domaine et de l'infrastructure pour accomplir des tâches génériques. Il n'utilise que des DTO comme entrée/sortie, de sorte que le domaine n'est jamais exposé au-delà de cette couche.Dois-je abstraire la configuration d'un conteneur IOC de l'interface utilisateur?
Maintenant, nous voulons ajouter un conteneur d'injection de dépendance dans le mélange et nous sommes confrontés à des choix difficiles. Nous avons deux applications clientes qui utilisent les services d'application pour faire leur travail: une application MVC 2 et une application de service Windows. Traditionnellement, tout le code de configuration pour effectuer le travail d'injection de dépendances est placé dans le fichier global.asax du projet mvc, dont j'ai vu de nombreux exemples. Le problème est que le code d'enregistrement IOC est ensuite dupliqué dans le service Windows et modifié légèrement pour cette plate-forme.
Le problème est que je DI nécessite l'application cliente pour savoir quoi et comment enregistrer, ce qui nécessite également l'application cliente d'avoir des références aux couches de domaine et de l'infrastructure. L'idée d'avoir une couche de services d'application était que c'était la seule chose que les clients devraient savoir et à qui parler. Ma solution proposée était de créer un «service de dépendance» dans ma couche de service d'application que les clients appellent une fois, et il configurerait le conteneur DI puisqu'il sait ce qui est requis. Il aurait également des méthodes pour permettre à l'application cliente d'enregistrer ses propres dépendances supplémentaires. Par exemple, le projet MVC enregistrerait sa fabrique de contrôleurs et le service Windows enregistrerait sa classe de démarrage. Je voulais savoir si cela est rare ou si je suis sur le mauvais chemin avec cette idée. Quelqu'un d'autre a-t-il déjà rencontré ce problème?
Comment enregistrer des types spécifiques au Web, par exemple, de cette façon? IoCConfigurator n'aura-t-il pas besoin de connaître et d'être lié à tous les différents environnements d'exécution possibles? Si vous devez enregistrer des contrôleurs MVC dans le conteneur sous l'hôte Web, vous ne souhaitez probablement pas les enregistrer (ni même déployer l'assembly) sur l'hôte du processus de service. –
Cela dépend de quelle partie de mon projet est impliqué. Si j'ai besoin d'IoC dans mon projet DomainModel, je vais créer un IoCConfigurator pour ces dépendances spéciales dans ce projet. Si j'ai également besoin d'IoC dans mon projet WebUI MVC, je créerai également un IoCConfigurator pour ce projet. J'essaie de faire en sorte que le projet soit le moins possible couplé. Par exemple, lorsque j'ai besoin de l'assembly DomainModel dans mon projet WebService, je ne gère pas les éléments de configuration IoC manuellement. Je suppose qu'il existe un configurateur pour les dépendances spécifiques dans cet assembly. – Mariusz