Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Telling StructureMap to use another Constructor

I have a class with 2 constructors.

MyClass()

and

MyClass(IMyService service)

How do I tell StructureMap then whenever I do a 'new MyClass()' it should actually call the second constructor and not the first constructor.

Please help.

like image 615
Gautam Jain Avatar asked Aug 09 '11 15:08

Gautam Jain


2 Answers

If you call new MyClass(), then StructureMap is not involved at all. No amount of StructureMap configuration will change the behavior.

If you call ObjectFactory.GetInstance<MyClass>(), StructureMap will by default call the constructor with more parameters.

If you want StructureMap to use a different constructor, you can specify the constructor (via PHeiberg's answer):

x.SelectConstructor<IMyClass>(() => new MyClass(null));

Or you can just tell StructureMap explicitly how to create the instance using the overload of Use() that accepts a Func<>:

x.For<IMyClass>().Use(ctx => new MyClass(ctx.GetInstance<IMyService>()))
like image 177
Joshua Flanagan Avatar answered Nov 04 '22 22:11

Joshua Flanagan


Joshua's answer is covering all aspects. As a side note in order to configure Structuremap to choose a specific constructor without hardcoding the arguments to the constructor as done in Joshua's example you can use the SelectContructor method:

x.SelectConstructor<MyService>(() => new MyService());

The lambda in the SelectConstructor method call should invoke the needed constructor (put nulls or any value of the correct type for all parameters present). See the documentation for further info.

like image 37
PHeiberg Avatar answered Nov 04 '22 21:11

PHeiberg