2017-04-17 6 views
0

Ich habe eine Schnittstelle, die wir IFoo, aus Gründen der Argumentation, die mit Dateien funktioniert. Die Implementierung dieser Schnittstelle erhält in ihrem Konstruktor eine FileInfo. In meinem Bootstrap-Programm, ich habe es wie folgt ein:Verwenden von Unity, wie soll ich ein "Model" an einen aufgelösten Typ übergeben?

container.RegisterType<IFoo, Foo>(); 

Das Problem ist, dass ich weiß nicht, welche FileInfo ich in die Foo Instanz übergeben müssen, bis es gelöst ist. Ich werde eins haben, und ich muss es in den Konstruktor übergeben.

Ich habe ältere Beiträge gesehen, die eine Parameterüberschreibung und die Verwendung von container.Resolve empfehlen, aber ich verstehe, dass dies in der Regel eine schlechte Praxis ist.

Gibt es einen empfohlenen Ansatz, um das zu erreichen, was ich tun muss?

TLDR: Ich muss in der Lage sein, so etwas zu tun, das nicht verpönt:

container.Resolve<IFoo>(*pass my constructor arg here*) 

Antwort

1

Das Problem ist, dass ich weiß nicht, was ich in die Fileinfo passieren müssen Foo-Instanz, bis sie aufgelöst ist.

Dies bedeutet, dass FileInfo ist Laufzeitdaten, während die Anwendungskomponenten (Ihr Foo) nicht Laufzeitdaten während der Bauphase erforderlich.

Bitte lesen Sie this article für eine ausführliche Diskussion darüber, warum Laufzeitdaten schlecht sind und welche Lösungen es gibt.

+0

Ich kam zu dieser Schlussfolgerung selbst. Als ich darüber nachdachte, wie schwierig es war, das Objekt zu konstruieren, überlegte ich, ob es sich um ein grundlegendes Problem bei der Gestaltung der Klasse handelte oder nicht. Ich habe das Argument vom Konstruktor in eine neue Methode verschoben, und das Problem hat sich praktisch selbst gelöst. Weiser Ratschlag. Vielen Dank. –

+2

Bitte beachten Sie: Wenn Sie 'FileInfo' in eine' IFoo.Initialize (FileInfo) 'Methode verschoben haben, benötigt Ihre Komponente noch während der Initialisierung Laufzeitdaten, aber jetzt haben Sie [Temporal Coupling] (http: // blog. ploeh.dk/2011/05/24/DesignSmellTemporalCoupling/). – Steven

+0

Die betreffende Klasse stellt Datei-IO bereit. Es ist ein vereinfachter Deserializer mit Standard-Open-, Read-, Close-Operationen, und das war's. Die Menge der zeitlichen Kopplung ist meiner Meinung nach akzeptabel. Das Vermeiden von temporaler Kopplung hat mich dazu gebracht, die 'FileInfo' im Konstruktor an erster Stelle zu setzen, aber in diesem * bestimmten * Fall ist die zeitliche Kopplung das kleinere von zwei Übeln. (Bonuspunkte für den richtigen Gebrauch von "temporal" in einem Satz !!) –

Verwandte Themen