Reputation:
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?
Upvotes: 37
Views: 16442
Reputation: 33118
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>());
Upvotes: 14
Reputation: 8557
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>();
});
Upvotes: 54
Reputation: 17278
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.
Upvotes: -4
Reputation: 2052
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.
Upvotes: 1