2

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

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

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

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

4

1 回答 1

1

你是正确的,GetAll直到你以某种方式枚举它之前实际上并没有做任何事情。当您要求 a 时IEnumerable,拉出的每个项目都会使其栩栩如生——即使它即将被 a 过滤Where(唯一可能的方法IQueryable是参与其中)。

已激活的每个项目将根据正常范围规则停用。

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


不要阅读这点 - 不好的建议如下。

一个疯狂的黑客是请求一个IEnumerable<Lazy<T>>(这将需要Ninject.Extensions.Factory)。很好的相关文章

于 2013-05-20T20:09:44.927 回答