2008-10-01 8 views
5

Ich bin ein bisschen ein DI-Neuling, also vergib mir, wenn das die falsche Herangehensweise oder eine dumme Frage ist.Wie soll ich meine CTor-Parameter für DI/IOC bestellen?

Sagen wir, ich habe ein Formular, das eine Bestellung erstellt/aktualisiert, und ich weiß, dass es eine Liste von Produkten und Kunden abrufen muss, die angezeigt werden sollen. Ich möchte das Order-Objekt übergeben, das gerade bearbeitet wird, aber ich möchte auch ProductsService und CustomersService als Abhängigkeiten einfügen.

Also werde ich wollen, dass mein IoC-Container (je nachdem, mit welchem ​​ich gehe) die Dienste liefert, aber es liegt an dem aufrufenden Code, um das Order-Objekt zu bearbeiten.

Sollte erkläre ich den Konstruktor als das Order-Objekt als ersten Parameter zu nehmen und die Produkteservice und CustomersService danach, zB:

public OrderForm(Order order, ProductsService prodsSvc, CustomersService custsSvc) 

... oder sollten die Abhängigkeiten stehen an erster Stelle und die Order-Objekt zuletzt, zB:

public OrderForm(ProductsService prodsSvc, CustomersService custsSvc, Order order) 

Ist es wichtig? Kommt es darauf an, welchen IoC-Container ich verwende? Oder gibt es einen "besseren" Weg?

Antwort

4

Ich stimme nicht mit @ akus Antwort überein.

Ich denke, was du machst ist in Ordnung und es gibt auch andere Möglichkeiten, es zu tun, die nicht mehr oder weniger richtig sind. Zum Beispiel kann man sich fragen, ob dieses Objekt überhaupt von Diensten abhängig sein sollte.

Unabhängig von DI, ich denke, es ist hilfreich, in Ihrem Kopf mindestens die Art des Zustands jedes Objekts zu klären, wie den realen Zustand (Ordnung), abgeleiteten Zustand (falls vorhanden) und Abhängigkeiten (Dienstleistungen):

http://tech.puredanger.com/2007/09/18/spelunking/

an jedem Konstruktor oder eine Methode, ziehe ich die realen Daten zuerst und Abhängigkeiten oder externe Sachen weitergegeben werden zuletzt weitergegeben werden. In deinem Beispiel würde ich das erste bevorzugen.

5

Matt, sollten Sie nicht normale Parameter mit Abhängigkeiten mischen. Da Ihr Objekt in den Interna des IoC-Containers erstellt wird, wie werden Sie die notwendigen Argumente angeben?

Mischabhängigkeit und normale Argumente machen die Logik Ihres Programms komplizierter.

In diesem Fall wäre es besser, Abhängigkeitseigenschaften zu deklarieren (das heißt Abhängigkeiten von Konstruktor entfernen) oder um Feld initialisieren, nachdem IoC Orderform konstruiert und gelöst es Abhängigkeiten ist (das heißt normale Parameter aus Konstruktor entfernen).

Sie können auch alle Ihre Parameter, einschließlich Bestellung als Abhängigkeiten zu deklarieren.

+0

Ok, das macht Sinn. Also benutze ich entweder property injection für alle meine Abhängigkeiten oder NUR Abhängigkeiten in den ctor und führe eine Eigenschaft für das "notwendige" Objekt ein? –

+0

Ja, du hast Recht. Mischen Sie keine DP- und normalen Eigenschaften, da dies zu unvorhergesehenen Problemen führen und die Auswahl geeigneter IoC-Frameworks einschränken kann. – aku

3

Ich fühle mich etwas unwohl, wenn ich eine Instanz von OrderForm instanziieren lasse, ohne die erforderliche Referenz auf eine Order-Instanz. Ein Grund könnte sein, dass dies mich daran hindern würde, im Voraus nach Null-Bestellungen zu suchen. Irgendwelche weiteren Gedanken?

Ich denke, ich könnte ein wenig Trost darin finden, dass OrderForm-Objekte nur durch eine Factory-Methode instanziiert werden, die sicherstellt, dass die Order-Eigenschaft nach dem Aufruf des IoC-Frameworks gesetzt ist.

+0

In meiner Antwort schlug ich mehrere Ansätze vor, darunter einen mit obligatorischem ** Order ** -Parameter. Bei Fragen ging es jedoch darum, DP und normale Eigenschaften zu mischen. Meine Antwort ist - nicht mischen. Ich würde mich freuen, konstruktive Kritik zu hören. – aku

Verwandte Themen