【问题标题】:Can Dependency Injection delay creating objects required?依赖注入可以延迟创建所需的对象吗?
【发布时间】:2010-12-07 17:50:15
【问题描述】:

我正在使用我的 ASP.NET MVC 应用程序进行一些依赖注入 (StructureMap)。效果很好。

因为 StructureMap 正在通过 最贪婪的构造函数 使用 DI(我希望我的这个概念命名正确),我的印象是它为每个参数创建了一个对象的实例,在最牛逼的构造函数。

那么,是否可以告诉 DI 框架(在这种情况下,它是 StructureMap,但我很好奇它是否可以为任何其他 .NET DI 框架执行此操作)在调用构造函数时不创建实例,但是延迟该对象的构造直到需要?

有点像一些惰性对象构造之类的......

【问题讨论】:

标签: asp.net-mvc dependency-injection structuremap


【解决方案1】:

简短回答:是的,您可以这样做。使用 .Net 4 Lazy<T> 类注册您的类型,如下所示:

x.For(typeof(Lazy<>)).Use(typeof(Lazy<>))
 .CtorDependency<bool>("isThreadSafe").Is(true);

有关详细答案和解释,请参阅我对问题 6811956 的回答。我认为它会给你你所需要的。如果您不使用 .Net 4,则必须实现自己的 Lazy&lt;T&gt; 类才能完成此任务。请参阅问题3207580 作为起点。

Does Structuremap support Lazy out of the box?

Implementation of Lazy<T> for .NET 3.5

更新:在 StructureMap 3 中,“CtorDependency”已经变成了“Ctor”,但在其他方面似乎工作方式相同。

【讨论】:

  • 这个问题不是在问具体的懒惰类型,所以我认为这个答案虽然有帮助,但有点绕道。最简单的答案是只接受一个 Func 代替您的构造函数参数。
  • 他在问是否可以延迟对象的创建,我已经展示了如何使用 Lazy 类来做到这一点,因为这正是它的目的。接受 Func 只是完成同一件事的另一种方式,只是现在您负责缓存第一次执行的结果,这样您就不会在每次引用 Func 时创建新副本。我发现 Lazy 类是避免这些问题的一种干净的方法,因此我建议采用这种方法来解决最初的问题。
【解决方案2】:

当单例对象需要访问会话范围对象时,所有支持单例->会话/请求范围映射的框架通常都会实例化一个代理对象而不是“真实”对象。 “真实”实例的构建通常推迟到第一次调用代理上的方法。

我相信温莎城堡支持这种机制。

【讨论】:

    猜你喜欢
    • 2012-04-12
    • 1970-01-01
    • 2011-12-31
    • 2012-11-17
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多