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>();
I get two different MyClass instances with the above code. How can I get one?
You can use the Forward<,>() registration to tell StructureMap to resolve a type using the resolution of a different type. This should do what you expect:
ObjectFactory.Initialize(x =>
{
x.For<IInterface1>().Singleton().Use<MyClass>();
x.Forward<IInterface1, IInterface2>();
});
I would register the MyClass itself and then pull that out of the context for the Use statements of the individual interfaces.
ForSingletonOf<MyClass>().Use<MyClass>();
For<IInterface1>().Use(ctx => ctx.GetInstance<MyClass>());
For<IInterface2>().Use(ctx => ctx.GetInstance<MyClass>());
Try looking at the different overloads to Use, especially Func overload. From there you can tell how StructureMap should create your instance with another object already registred.
An ObjectFactory
is intended to create multiple instances. If you want a singleton, write a singleton class (perhaps with public IInterface1
and IInterface2
properties as accessors).
It seems sketchily documented, but perhaps you can use a Container instead.
来源:https://stackoverflow.com/questions/2363458/structuremap-singleton-usage-a-class-implementing-two-interface