James
James

Reputation:

StructureMap singleton usage (A class implementing two interface)

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

Answers (4)

Chris Marisic
Chris Marisic

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

Joshua Flanagan
Joshua Flanagan

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

Pontus Gagge
Pontus Gagge

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

Kenny Eliasson
Kenny Eliasson

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

Related Questions