【发布时间】:2011-08-09 15:03:28
【问题描述】:
我有一个有 2 个构造函数的类。
MyClass()
和
MyClass(IMyService 服务)
我如何告诉 StructureMap 那么每当我执行“new MyClass()”时,它实际上应该调用第二个构造函数而不是第一个构造函数。
请帮忙。
【问题讨论】:
标签: dependency-injection inversion-of-control structuremap
我有一个有 2 个构造函数的类。
MyClass()
和
MyClass(IMyService 服务)
我如何告诉 StructureMap 那么每当我执行“new MyClass()”时,它实际上应该调用第二个构造函数而不是第一个构造函数。
请帮忙。
【问题讨论】:
标签: dependency-injection inversion-of-control structuremap
如果你打电话给new MyClass(),那么StructureMap 根本不涉及。再多的 StructureMap 配置都不会改变行为。
如果你调用ObjectFactory.GetInstance<MyClass>(),StructureMap会默认调用带有更多参数的构造函数。
如果您希望 StructureMap 使用不同的构造函数,您可以指定构造函数(通过 PHeiberg 的回答):
x.SelectConstructor<IMyClass>(() => new MyClass(null));
或者您可以明确告诉 StructureMap 如何使用接受Func<> 的Use() 的重载来创建实例:
x.For<IMyClass>().Use(ctx => new MyClass(ctx.GetInstance<IMyService>()))
【讨论】:
ctx.GetInstance<> 只允许 1 个类型参数。
约书亚的回答涵盖了方方面面。作为旁注,为了配置 Structuremap 以选择特定的构造函数,而不像 Joshua 的示例中那样硬编码构造函数的参数,您可以使用 SelectContructor 方法:
x.SelectConstructor<MyService>(() => new MyService());
SelectConstructor 方法调用中的 lambda 应该调用所需的构造函数(为所有存在的参数放置空值或任何正确类型的值)。请参阅the documentation 了解更多信息。
【讨论】:
当使用像结构映射这样的 DI 容器时,最好在每个类上只使用一个构造函数。此构造函数必须解析类的所有依赖项,如果 IMyService 是一个依赖项(虽然看起来有点奇怪),则应始终在实例化时解决此问题,因此不需要无参数构造函数。
【讨论】: