2010-03-02 9 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>(); 

Obtengo dos instancias de MyClass diferentes con el código anterior. ¿Cómo puedo obtener uno?Uso de Singleton de StructureMap (una clase que implementa dos interfaces)

Respuesta

51

Puede utilizar el registro del Forward <,>() para contar StructureMap para resolver un tipo usando la resolución de un tipo diferente. Esto debería hacer lo que esperas:

+0

aaaawesome. Exactamente lo que estaba buscando. gracias – GR7

-4

Un ObjectFactory es previsto para crear varias instancias. Si desea un singleton, escriba una clase singleton (quizás con propiedades públicas IInterface1 y IInterface2 como accesadores).

Parece estar documentada de forma incompleta, pero quizás pueda usar un Container en su lugar.

+9

El contenedor (ya sea ObjectFactory o un contenedor creado manualmente) puede manejar el ciclo de vida del objeto para ti, sin necesidad de implementar el comportamiento de singleton. –

1

Intenta observar las diferentes sobrecargas que se deben utilizar, especialmente la sobrecarga de Func. Desde allí, puede ver cómo StructureMap debería crear su instancia con otro objeto ya registrado.

12

Registraría el MyClass mismo y luego lo sacaría del contexto para las instrucciones de uso de las interfaces individuales.

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

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

¡Esto es lo que funcionó para mí! El método "x.Forward" no funcionó, mi código no pudo resolver IInterface2. – andyhammar

+3

@andyhammer Es posible que haya cambiado las dos interfaces. FROM es primero, TO es segundo. Cometí ese error ... Buena solución, estaba pensando que tenía un mal diseño y que no era posible, pero creo que otros tienen el mismo problema, gracias a Dios. – Syska

+0

Creo que este enfoque es más limpio, no me gusta acoplar estas interfaces entre sí. –

Cuestiones relacionadas