Abhängigkeitsinversion. Objekt erstellen

8

Laut SOLID-Prinzipien kann eine Klasse nicht von anderen Klassen abhängen, Abhängigkeiten müssen injiziert werden. Es ist einfach:

%Vor%

Aber was, wenn ich möchte, dass meine Foo-Klasse in der Lage ist, Bars zu erstellen, ohne die genaue Implementierung hinter IBar zu kennen? Ich kann hier an 4 Lösungen denken, aber alle scheinen Nachteile zu haben:

  1. den Objekttyp injizieren und Reflexion verwenden
  2. mit Generics
  3. über "Service Locator" und Aufrufen der Resolve () -Methode.
  4. Erstellen einer separaten Factory-Klasse und Einfügen in Foo:
%Vor%

Letzter Fall scheint natürlich, aber BarCreator-Klasse hat zu wenig Code. Also wie denkst du, welches ist das Beste?

    
tov.Novoseltsev 26.08.2011, 11:23
quelle

5 Antworten

3

Ich möchte in diesem Fall Func<IBar> "injizieren". Wie so:

%Vor%     
Carsten 26.08.2011 11:35
quelle
3

Dafür wurden Fabriken geschaffen.

Wenn Sie der Meinung sind, dass Ihre Fabrik zu wenig Code hat, fragen Sie sich, welchen Nutzen Sie daraus ziehen, wenn Sie die Instanz nur inline erstellen. Wenn die Vorteile die Kosten des hinzugefügten Codes übersteigen, machen Sie sich keine Sorgen.

Ich würde den Service-Standort persönlich meiden, oder wenn Sie ihn wirklich benutzen müssen, würde ich ihn sowieso hinter einer Fabrik verstecken. Der Servicestandort kann leicht missbraucht werden und dazu führen, dass der Container in Code eindringt, mit dem er nichts zu tun haben sollte.

Aus praktischen Gründen können Sie in einigen Containern eine Factory angeben, die vom Container verwendet wird, wenn eine Instanz einer Komponente erstellt wird. In diesem Fall könnte Ihre Klasse direkt von IBar abhängen, aber Ihr Container würde IBarCreator aufrufen, wenn eine neue Instanz benötigt wird. Castle Windsor hat zum Beispiel die Methoden UseFactory und UseFactoryMethod in ihrer API.

    
James Gregory 26.08.2011 11:42
quelle
2

Alles hängt von Ihrem genauen Szenario und Ihren Bedürfnissen ab.
Ich denke, der am häufigsten verwendete Ansatz ist, wie Sie bereits erwähnt haben, eine Fabrik Wenn Sie ein IoC-Framework verwenden (z. B. Ninject oder Sprint.Net, Castle Windsor usw.), siehe J. Ed 26.08.2011 11:33

quelle
2

Wenn Sie ein Problem mit der redundanten Factory-Schnittstelle haben, können Sie hier zwei Vorgehensweisen wählen.

Machen Sie es mit Generics wiederverwendbar:

%Vor%

Oder verwenden Sie die anonyme Funktion als Factory:

%Vor%     
George Polevoy 26.08.2011 11:37
quelle
0

Ich fühle, wenn du sagst "Ich möchte, dass meine Foo-Klasse in der Lage ist, Bars zu erschaffen", kommt eine weitere Regel, die "Trennung von Sorgen" ist. Sie sollten also die Aufgabe der Klassenerstellung an etwas anderes delegieren und Foo sollte sich keine Sorgen um diese Aufgabe machen.

    
Nilesh 26.08.2011 11:33
quelle