告诉StructureMap使用另一个构造函数

时间:2011-08-09 15:03:29

标签: dependency-injection inversion-of-control structuremap

我有一个包含2个构造函数的类。

MyClass的()

MyClass(IMyService服务)

如果我做一个'new MyClass()',我怎么告诉StructureMap它实际上应该调用第二个构造函数而不是第一个构造函数。

请帮忙。

3 个答案:

答案 0 :(得分:22)

如果您致电new MyClass(),则根本不涉及StructureMap。没有任何StructureMap配置会改变行为。

如果你调用ObjectFactory.GetInstance<MyClass>(),StructureMap默认会使用更多参数调用构造函数。

如果你想让StructureMap使用不同的构造函数,你可以指定构造函数(通过PHeiberg的答案):

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

或者您可以使用接受Use()的{​​{1}}重载来明确告诉StructureMap如何创建实例:

Func<>

答案 1 :(得分:5)

约书亚的答案涵盖了各个方面。作为旁注,为了配置Structuremap以选择特定的构造函数而不用如Joshua的例子中那样对构造函数进行硬编码,您可以使用SelectContructor方法:

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

SelectConstructor方法调用中的lambda应该调用所需的构造函数(为所有存在的参数放置空值或任何正确类型的值)。有关详细信息,请参阅the documentation

答案 2 :(得分:0)

当使用像struct structure这样的DI容器时,最好只在每个类上使用一个构造函数。如果IMyService是一个依赖项(虽然看起来有点奇怪),这个构造函数必须解析该类的所有依赖项,这在实例化时应该总是被解析,因此不需要无参数构造函数。