可以使用依赖注入延迟创建对象吗?

时间:2009-10-18 07:43:45

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

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

因为结构地图正在通过最多gready构造函数使用DI(我希望我的命名是正确的),我的印象是它为每个参数创建了一个对象的实例,最有条理的构造函数。

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

Sorta就像一些懒惰的对象构造或其他......

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

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

对于长篇答案和解释,请参阅我对问题6811956的回答。我认为它会给你你需要的东西。如果你不使用.Net 4,你必须实现自己的Lazy<T>类来解决这个问题。请将问题3207580作为起点。

Does Structuremap support Lazy out of the box?

Implementation of Lazy<T> for .NET 3.5

UPDATE:在StructureMap 3中,“CtorDependency”已经变成了“Ctor”,但在其他方面似乎也在起作用。