2010-05-18 14 views
6

Ist es eine gute Praxis, eine Factory-Methode zum Abrufen von injizierten Objekten zu verwenden, oder ist es in Ordnung, die Factory-Methode aus dem DI-Framework zu verwenden?Verwenden von Factory zum Abrufen injizierter Objekte

Ich verwende Strukturkarte, sollte ich nur ObjectFactory.GetInstance(); verwenden, oder sollte ich Factory-Klasse erstellen und innerhalb dieser Klasse Aufruf ObjectFactory.GetInstance(); weil, wenn ich ObjectFactory.GetInstance() aufrufen; in meinen Klassen würde ich eine Kopplung mit dem DI-Framework erstellen? Tut mir leid, wenn ich ignorant bin, ich bin neu in diesem Konzept. Vielen Dank!

Antwort

3

Wenn Sie bereits ein DI-Framework verwenden, sollten Sie das Factory-Muster erneut implementieren, wenn es bereits vom Framework bereitgestellt wird. Außerdem sollten Sie keine Abhängigkeit mit dem DI-Framework in den Business-Schichten der Anwendung erstellen. Dort sollten Sie mit Interfaces und abstrakten Klassen abstrahieren. Das DI-Framework sollte nur auf der höchsten Ebene verwendet werden, beispielsweise in der GUI, um die Installation der unteren Schichten durchzuführen und beispielsweise eine geeignete Datenzugriffsschicht auszuwählen.

+1

ich mit Darin einverstanden sind, lassen Sie die DI Rahmen tun, es ist Arbeit statt Funktionalität zu duplizieren. –

3

Eine Factory-Methode ist nützlich, wenn Sie feinkörnige Kontrolle über benötigen, wenn Sie die Instanz benötigen. Trotzdem sollten Sie nicht direkt auf den Container selbst angewiesen sein, sondern eine Factory-Methode als Abhängigkeit einfügen. Hier ist ein Beispiel dieser Veranschaulichung:

public class SomeController 
{ 
    private Func<ISomeService> _serviceFactory; 
    public SomeController(Func<ISomeService> serviceFactory) 
    { 
     _serviceFactory = serviceFactory; 
    } 

    public void DoSomeWork() 
    { 
     var service = _serviceFactory(); 
     .... 
    } 
} 

Der StructureMap Registrierungscode würde wie folgt aussehen:

var container = new Container(cfg => 
    cfg.For<ISomeService>().Use(() => new SomeServiceImpl()) 
); 
Verwandte Themen