Dépendance Injection et structure de projet pour les applications console

J’ai 4 projets:

Core (IServer):

  • Système
  • System.Core

DependencyResolver:

  • Coeur
  • StructureMap

Infrastructure (service):

  • Coeur
  • Dépendance externe

Console:

  • Coeur
  • DependencyResolver

Requierements:

J’essaie d’utiliser StructureMap uniquement dans DependencyResolver. De plus, l’application Console ne doit rien savoir d’Infrastucture.

Lorsque je ne veux pas faire référence à StructureMap sur mon application console, je dois créer un ServiceLocator.

Dans DependencyResolver, j’ai un Bootstrapper responsable de l’appel du matériel de registre StructureMap (Register).

Dans mon application console, je souhaite obtenir une instance. Pour cela, je dois faire référence à StructureMap. Une autre solution consiste à écrire un petit wrapper autour des méthodes de résolution StructureMaps.

Existe-t-il un meilleur moyen de découpler la console de StructureMap?

    Bien que je vois une raison pour séparer registre, résolution, libération de l’implémentation de l’application IoC, je ne vois aucune raison pour laquelle le conteneur IoC ne devrait pas figurer dans l’application de la console (la racine de la composition) ni dans son implémentation l’assemblée à la place.

    De cette façon, l’application de la console est très simple:

    1. Créer le conteneur
    2. Charger la configuration du conteneur
    3. Résoudre l’application
    4. Appel lancé sur l’application et transmission des arguments de la console
    5. élimine le conteneur lorsque l’application quitte la méthode d’exécution

    Avec SM, cela ressemble à ceci:

    public void Main(params ssortingng[] args) { using (var container = new Container()) { container.LoadAllConfigurationModules(); container.AddRegistry(); container.GetInstance().Run(args); } } 

    Pour les choses que vous ne pouvez pas créer au démarrage, vous créez une interface de fabrique dans votre assemblage d’applications:

     interface ISomeFactory { ISomeDependency CreateSomeDependency() } 

    et implémentez cette interface dans l’application console en injectant le conteneur et utilisez-le pour résoudre l’instance. Je suppose que l’implémentation SM ressemble à ceci:

     public class SomeFactory : ISomeFactory { public SomeFactory(IContainer sontainer) { this.container = container; } ISomeDependency CreateSomeDependency() { this.container.GetInstance(); } } 

    D’autres conteneurs IoC ont même la fonctionnalité pour implémenter ces fabriques d’interface automatiquement.