Mit einer Fabrik können Sie verwandte Schnittstellen gruppieren. Wenn also die übergebenen Parameter in einer Fabrik gruppiert werden können, ist dies auch eine gute Lösung für constructor overinjection
Sehen Sie sich diesen Code an *):
public AddressModelFactory(IAddressAttributeService addressAttributeService,
IAddressAttributeParser addressAttributeParser,
ILocalizationService localizationService,
IStateProvinceService stateProvinceService,
IAddressAttributeFormatter addressAttributeFormatter)
{
this._addressAttributeService = addressAttributeService;
this._addressAttributeParser = addressAttributeParser;
this._localizationService = localizationService;
this._stateProvinceService = stateProvinceService;
this._addressAttributeFormatter = addressAttributeFormatter;
}
Sehen Sie sich den Konstruktor an, Sie müssen nur die IAddressModelFactory
dort, also weniger Parameter *):
public CustomerController(IAddressModelFactory addressModelFactory,
ICustomerModelFactory customerModelFactory,
IAuthenticationService authenticationService,
DateTimeSettings dateTimeSettings,
TaxSettings taxSettings,
ILocalizationService localizationService,
IWorkContext workContext,
IStoreContext storeContext,
ICustomerService customerService,
ICustomerAttributeParser customerAttributeParser,
ICustomerAttributeService customerAttributeService,
IGenericAttributeService genericAttributeService,
ICustomerRegistrationService customerRegistrationService,
ITaxService taxService,
CustomerSettings customerSettings,
AddressSettings addressSettings,...
Sie sehen in CustomerController
eine Menge von Parametern übergeben, Ja, Sie können dies sehen als constructor overinjection
aber so funktioniert die DI. Und nein, es ist nichts falsch mit dem CustomerController
.
*) Der Code stammt von nopCommerce.
27 Stimmen
Können sich diese beiden Ansätze nicht gegenseitig ergänzen, indem man Dependency Injection zur Injektion von Fabrikklassen verwendet?
21 Stimmen
Es wäre wirklich schön, wenn diese Frage mit einem Code beantwortet werden könnte! Ich sehe immer noch nicht, wie DI vorteilhaft/unterschiedlich von der Verwendung einer Fabrik für die Erstellung sein würde? Sie müssen nur diese eine Zeile in der Fabrikklasse ersetzen, um zu ändern, welches Objekt/Implementierung erstellt wird?
2 Stimmen
@gideon würde das nicht dazu führen, dass Sie Ihre Anwendung kompilieren müssen, oder zumindest das Modul, das die Fabrikklasse enthält?
1 Stimmen
@liortal Ja, das ist richtig. Habe eine lange Studie über DI seit diesem Kommentar und jetzt verstehe ich die DI nimmt die Fabrik-Methode einen Schritt voraus.
1 Stimmen
Sehen Sie sich diese großartige Antwort an: stackoverflow.com/questions/4985455/ - er formuliert es sehr gut und liefert Codebeispiele.
0 Stimmen
Haben Sie jemals eine Anwendung von Dependency Injection gesehen, die keine Factories verwendet hat? Das wäre seltsam, da Dependency Injection bedeutet, dass der Code zur Erstellung eines Objekts an einer einzigen Stelle platziert wird, was die gesamte Komplexität/Abstraktion/den ganzen Overhead einer Factory mit sich bringt. Wäre es nicht dumm, DI zu verwenden, aber keine Fabriken?
0 Stimmen
Falls jemand daran interessiert ist, wie Dependency Injection in einem Coffeeshop-Theme hilfreich sein kann, habe ich hier einen Artikel darüber geschrieben: digigene.com/design-patterns/dependency-injection-coffeeshop
0 Stimmen
Die Antwort mit den meisten Stimmen macht keinen Sinn. Das Factory Design Pattern verwendet das Prinzip der Abhängigkeitsinversion, das die Instanziierung des Codes in eine andere Klasse auslagert, daher macht seine Antwort keinen Sinn.
0 Stimmen
Um eine gute Dependency Injection zu machen, müssen Sie sich auf Factories verlassen, die es Ihnen erlauben, eine Composition Root zu machen, eine obere Schicht, die alle Ihre entkoppelten Komponenten zusammen verdrahtet, die zu Ihrem Implementierungsfall passen, Sie können einen Blick auf die Di-Ninja Bibliothek werfen, dies ist ein gutes Beispiel für Quellcode, um die Ziele der Dependency Injection zu erklären github.com/di-ninja/di-ninja