Wie verwaltet man Config mit Dependency Injection?


18

Ich bin ein großer Fan von DI / IOC. Es ist großartig, um harte Abhängigkeiten zu verarbeiten / zu abstrahieren, und erleichtert das Leben ein wenig.

Allerdings habe ich ein kleines Problem damit, das ich nicht sicher bin, wie ich es lösen soll.

Die Grundidee in DI / IOC ist, dass beim Instanziieren eines Objekts alle Abhängigkeiten im Konstruktor vorab ausgefüllt werden.

IMHO gibt es jedoch verschiedene Arten von Parametern für Konstruktoren (insbesondere, wenn Ihre Objekte unveränderlich sind).

  1. Abhängigkeiten (Objekte, die für die Ausführung Ihres Objekts erforderlich sind)
  2. Konfiguration (Informationen zur Umgebung, die für die Ausführung der Arbeit erforderlich ist)
  3. Parameter (Daten, an denen gearbeitet wird)

Ich finde, dass IOC gut mit Abhängigkeiten funktioniert. Aber ich versuche immer noch, den besten Weg zu finden, um mit den anderen beiden umzugehen. Da der Konstruktor jedoch vom IOC-Container ausgeführt werden soll, muss ich diese Elemente anscheinend in den IOC-Container einfügen.

Ich würde gerne wissen, welche Strategien / Muster die Leute anwenden und welche Vor- und Nachteile die Leute gefunden haben.

NB. Mir ist bewusst, dass dies eine sehr subjektive Frage ist, und ich habe versucht, sie gemäß den SE-Richtlinien zu einer "guten" subjektiven Frage zu machen.


Mit "Konfiguration" meinen Sie die Entwicklungsumgebungskonfiguration (wie Entwicklung oder Produktion)? Wenn ja, behandle ich das normalerweise als eine traditionelle Abhängigkeit.
MetaFight

Am besten mit Abhängigkeiten aber Standardkonfiguration konstruieren, damit das Objekt gut geformt ist. Rufen Sie zusätzliche Methoden auf, um die Konfiguration und andere Parameter festzulegen. Zu viel im ctor zu tun ist eine schlechte Sache.
david.pfx

I am still trying to work out the best way to deal with the other two- Übergeben Sie sie als gewöhnliche Parameter an Ihr Objekt?
Robert Harvey

@RobertHarvey unveränderliche Objekte? Sie erleichtern das Debuggen erheblich.
ARTS

Antworten:


9

Konfiguration (Informationen zur Umgebung, die für die Ausführung der Arbeit erforderlich ist)

Erstellen Sie eine Konfigurationsklasse (um wählerisch zu sein: eine Schnittstelle + eine Implementierung), die Informationen über die Umgebung bereitstellen soll. Dies unterscheidet die Konfiguration in keiner Weise von anderen Objekten, die für die Ausführung Ihres Objekts erforderlich sind (Punkt 1).

Parameter (Daten, an denen gearbeitet wird)

In einer objektorientierten Umgebung können primitive Datentypen in Objekte eingekapselt werden, was auch zu Punkt 1 führt. Aber Sie werden diese SO-Frage wahrscheinlich interessant finden. Sie befasst sich genau mit der Situation primitiver Parameter in einem Konstruktor, wenn ein DI verwendet wird Container. In dem gegebenen Beispiel konnte das Design verbessert werden, wodurch die Notwendigkeit für primitive Typen im Konstruktor vollständig vermieden wurde.


1

Was ich tue, ist ein Fabrikmuster für diese Fälle.

Ich verwende das Objekt selbst nicht als Abhängigkeit, sondern erstelle ein Factory-Objekt mit einer Get-Methode, die Parameter akzeptiert, die vom Container nicht automatisch gebunden werden können.

Ex.:

 interface IDependencyObject {
       ....
 }

 class DependencyObject {

      public DependencyObject(int primitive, IAnotherDependency anotherDependency) {
      ...
      }

 }

 class DependencyObjectFactory {

      private readonly IAnotherDependency anotherDependency;

      public DependencyObjectFactory(IAnotherDependency anotherDependency) {
           this.anotherDependency = anotherDependency;
      }

      public IDependencyObject Get(int primitive) {
           return new DependencyObject(primitive, anotherDependency);
      }
 }

 interface IDependencyObjectFactory {
       IDependencyObject Get(int primitive);
 }
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.