Telling StructureMap to use another Constructor

爷,独闯天下 提交于 2019-11-30 19:29:53

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>()))
PHeiberg

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.

When using a DI container like structuremap it's best to have just a single constructor on every class. This constructor has to resolve all the dependencies of the class, if IMyService is a dependency (which looks a bit strange though) this should always be resolved when instantiating so the parameterless constructor is not needed.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!