在请求IEnumerable时,Ninject在什么时候激活服务

时间:2013-05-20 10:23:08

标签: ninject activation

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

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

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

我的理解是激活会在枚举上发生(在我们的情况下是FirstOrDefault)这是正确的吗?

1 个答案:

答案 0 :(得分:1)

你是正确的,GetAll实际上并没有做任何事情,直到你以某种方式枚举它。当您要求IEnumerable时,每个项目都会将其生效 - 即使它即将被Where过滤(如果涉及IQueryable,唯一可能的方式)。

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

避免这种情况的最佳方法是使用。当......或其他条件规定过滤时。


请勿阅读过这个要点 - 以后的建议很糟糕。

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