【问题标题】:At what point does activation of services happen in Ninject when requesting IEnumerable请求 IEnumerable 时,Ninject 在什么时候激活服务
【发布时间】:2013-05-14 21:18:00
【问题描述】:

我们在工作中使用 Ninject 作为对旧系统进行修改的一部分。在应用程序的某些部分,我们选择使用包含 Ninject 的静态服务定位器。这实际上只是一个静态适配器。

当我通过我们的服务定位器请求 IEnumerable<IFoo> 时,它只是通过 Ninject 的 GetAll 方法请求相同。我想知道的是,由于我还没有真正枚举列表,所有服务是否都会保持非活动状态。

我问的原因是我们正在使用 Ninject 来替换 WinForms 应用程序中的旧控制器定位器。其中一些控制器毛茸茸的,所以我不希望它们激活,直到我过滤到我想要的那个。我们的做法是将Where 子句应用于服务定位器上的集合,然后使用 FirstOrDefault 来选择正确的。

我的理解是激活将发生在枚举(在我们的例子中为FirstOrDefault)这是正确的吗?

【问题讨论】:

    标签: ninject activation


    【解决方案1】:

    您是正确的,GetAll 在您以某种方式枚举它之前实际上并没有做任何事情。当您要求IEnumerable 时,每一个被拉出的项目都会让它变得生动——即使它即将被Where 过滤(唯一的方法是如果涉及IQueryable)。

    激活的每个项目,将根据normal scoping rules 停用。

    避免这种情况的最佳方法是使用 .When... 或其他指示过滤的条件。


    不要读到这点 - 错误的建议如下。

    一个疯狂的黑客是请求IEnumerable<Lazy<T>>(这将需要Ninject.Extensions.Factory)。 Good related article.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      • 2020-01-04
      • 2015-01-06
      • 1970-01-01
      • 2020-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多