我有一个包含2个构造函数的类。
MyClass的()
和
MyClass(IMyService服务)
如果我做一个'new MyClass()',我怎么告诉StructureMap它实际上应该调用第二个构造函数而不是第一个构造函数。
请帮忙。
答案 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
是一个依赖项(虽然看起来有点奇怪),这个构造函数必须解析该类的所有依赖项,这在实例化时应该总是被解析,因此不需要无参数构造函数。