Dependency Injection und Projektstruktur für Konsolenanwendungen

8

Ich habe 4 Projekte:

Core (IServer):

  • System
  • System.Core

DependencyResolver:

  • Kern
  • Strukturkarte

Infrastruktur (Service):

  • Kern
  • Externe Abhängigkeit

Konsole:

  • Kern
  • DependencyResolver

Anforderungen:

Ich versuche, StructureMap nur im DependencyResolver zu verwenden. Außerdem sollte die Konsolenanwendung nichts über Infrastuktur wissen.

Wenn ich in meiner Konsolenanwendung nicht auf StructureMap verweisen möchte, muss ich einen ServiceLocator erstellen.

Im DependencyResolver habe ich einen Bootstrapper, der für den Aufruf von StructureMap-Registry-Stuff (Register) verantwortlich ist

In meiner Konsolenanwendung möchte ich eine Instanz bekommen. Dafür muss ich auf StructureMap verweisen. Ein anderer Weg wäre, einen kleinen Wrapper um die Methoden von StructureMaps zu schreiben.

Gibt es einen anderen besseren Weg, die Konsole von StructureMap zu entkoppeln?

    
Rookian 21.03.2012, 14:34
quelle

1 Antwort

17

Während ich einen Grund sehe, IoC-Register zu trennen, zu lösen und von der Implementierung der Anwendung freizugeben, sehe ich keinen Grund, warum der IoC-Container nicht in der Konsolenanwendung (dem Kompositionswurzel) und der Anwendung sein sollte Implementierung stattdessen in einer anderen Assembly.

Auf diese Weise ist die Konsolenanwendung sehr einfach:

  1. Erstellen Sie den Container
  2. Laden Sie die Containerkonfiguration
  3. Beheben Sie die Anwendung
  4. Rufen Sie die Anwendung auf und übergeben Sie die Konsolenargumente mit
  5. Entsorgen Sie den Container, wenn die Anwendung die run-Methode beendet

Mit SM sieht es ungefähr so ​​aus:

%Vor%

Für Dinge, die Sie beim Start nicht erstellen können, erstellen Sie eine Factory-Schnittstelle in Ihrer Anwendungsassembly:

%Vor%

und implementieren Sie diese Schnittstelle in der Konsolenanwendung, indem Sie den Container injizieren und ihn zum Auflösen der Instanz verwenden. Ich denke, die SM-Implementierung sieht so aus:

%Vor%

Andere IoC-Container verfügen sogar über die Funktionalität, diese Schnittstellenfactories automatisch zu implementieren.

    
Remo Gloor 22.03.2012, 11:50
quelle