2010-03-02 13 views
35
public interface IInterface1 
{ 
} 

public interface IInterface2 
{ 
} 

public class MyClass : IInterface1, IInterface2 
{ 
} 

... 

ObjectFactory.Initialize(x => 
{ 
    x.For<IInterface1>().Singleton().Use<MyClass>(); 
    x.For<IInterface2>().Singleton().Use<MyClass>(); 
}); 

var x = ObjectFactory.GetInstance<IInterface1>(); 
var y = ObjectFactory.GetInstance<IInterface2>(); 

Ich erhalte zwei verschiedene MyClass-Instanzen mit dem obigen Code. Wie kann ich einen bekommen?StructureMap Singleton-Verwendung (Eine Klasse, die zwei Schnittstellen implementiert)

Antwort

51

Sie können mit der Forward <,>() Anmeldung StructureMap anweisen, eine Art mit der Auflösung eines anderen Typs zu lösen. Dies sollte Ihren Erwartungen entsprechen:

+0

aaaawesome. genau das was ich gesucht habe. Danke – GR7

-4

Ein ObjectFactory ist vorgesehen, um mehrere Instanzen zu erstellen. Wenn Sie einen Singleton möchten, schreiben Sie eine Singleton-Klasse (vielleicht mit den öffentlichen Eigenschaften IInterface1 und IInterface2 als Accessoren).

Es scheint skizzenhaft dokumentiert, aber vielleicht können Sie stattdessen eine Container verwenden.

+9

Der Container (entweder ObjectFactory oder ein manuell erstellter Container) kann den Objektlebenszyklus für Sie übernehmen - Sie müssen das Singleton-Verhalten nicht selbst implementieren. –

1

Versuchen Sie, die verschiedenen Überladungen zu verwenden, insbesondere Func Überladung. Von dort können Sie sehen, wie StructureMap Ihre Instanz mit einem anderen bereits registrierten Objekt erstellen soll.

12

Ich würde die MyClass selbst registrieren und dann aus dem Kontext für die Use-Anweisungen der einzelnen Schnittstellen ziehen.

ForSingletonOf<MyClass>().Use<MyClass>(); 

For<IInterface1>().Use(ctx => ctx.GetInstance<MyClass>()); 
For<IInterface2>().Use(ctx => ctx.GetInstance<MyClass>()); 
+1

Das hat bei mir funktioniert! Die "x.Forward" -Methode hat nicht funktioniert, mein Code konnte IInterface2 nicht auflösen. – andyhammar

+3

@andyhammer Sie haben vielleicht die zwei Schnittstellen vertauscht. FROM ist zuerst, TO ist der zweite. Ich machte diesen Fehler ... Schöne Lösung, dachte ich hatte ein schlechtes Design und war nicht möglich, aber ich denke, andere haben das gleiche Problem, Gott sei Dank. – Syska

+0

Ich denke, dieser Ansatz ist sauberer, ich mag es nicht, diese Schnittstellen miteinander zu koppeln. –

Verwandte Themen