【发布时间】:2011-01-21 00:29:21
【问题描述】:
我正在使用 Ninject 1.0,并且希望能够将惰性初始化委托注入到构造函数中。因此,给定通用委托定义:
public delegate T LazyGet<T>();
我只想将它绑定到 IKernel.Get() 以便我可以将惰性 getter 传递给构造函数,例如
public class Foo
{
readonly LazyGet<Bar> getBar;
public Foo( LazyGet<Bar> getBar )
{
this.getBar = getBar;
}
}
但是,我不能简单地调用Bind<LazyGet<T>>(),因为它是一个开放的泛型类型。我需要这是一个开放的泛型,这样我就不必将所有不同的惰性获取绑定到显式类型。在上面的示例中,应该可以动态创建调用IKernel.Get<T>() 的通用委托。
如何使用 Ninject 1.0 实现这一点?
【问题讨论】:
-
注入一个显式惰性的依赖是,IMO,一个泄漏抽象。请参阅此处了解更多信息:blog.ploeh.dk/2010/01/20/…
-
我知道,但我正在转换一个现有的代码库,它有很多高度耦合的静态。这只是摆脱所有静态类的中间第一步。
-
很公平 :) 无论如何,我从来没有想过我的评论不屑一顾。但是,我指出的帖子确实通过将惰性实现为装饰器提供了一条出路。我只是不想将其作为答案提供,因为您可能会从其他人那里得到正确的 Ninject 答案:)
-
我不是 100% 清楚你的用例。但是您可以通过语法 Bind(typeof(LazyGet)) 绑定开放的泛型类型。不确定您要尝试将开放的通用委托绑定到什么。
-
您可以在我的书中找到有关此内容的更多信息以及其他更多信息:affiliate.manning.com/idevaffiliate.php?id=1150_236
标签: delegates lazy-loading generics ninject