【问题标题】:Telling StructureMap to use another Constructor告诉 StructureMap 使用另一个构造函数
【发布时间】:2011-08-09 15:03:28
【问题描述】:

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

MyClass()

MyClass(IMyService 服务)

我如何告诉 StructureMap 那么每当我执行“new MyClass()”时,它实际上应该调用第二个构造函数而不是第一个构造函数。

请帮忙。

【问题讨论】:

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


    【解决方案1】:

    如果你打电话给new MyClass(),那么StructureMap 根本不涉及。再多的 StructureMap 配置都不会改变行为。

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

    如果您希望 StructureMap 使用不同的构造函数,您可以指定构造函数(通过 PHeiberg 的回答):

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

    或者您可以明确告诉 StructureMap 如何使用接受Func&lt;&gt;Use() 的重载来创建实例:

    x.For<IMyClass>().Use(ctx => new MyClass(ctx.GetInstance<IMyService>()))
    

    【讨论】:

    • 如果我希望它使用具有 2 个参数的 MyClass 构造函数怎么办? ctx.GetInstance&lt;&gt; 只允许 1 个类型参数。
    【解决方案2】:

    约书亚的回答涵盖了方方面面。作为旁注,为了配置 Structuremap 以选择特定的构造函数,而不像 Joshua 的示例中那样硬编码构造函数的参数,您可以使用 SelectContructor 方法:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 对不起,我已经更正了。而不是 CMyService,我有用户 CMyClass。谢谢。
      猜你喜欢
      • 2010-09-26
      • 2013-12-17
      • 1970-01-01
      • 2011-01-16
      • 1970-01-01
      • 2011-03-24
      • 1970-01-01
      • 1970-01-01
      • 2011-01-20
      相关资源
      最近更新 更多