我们在工作中使用Ninject作为对旧系统的修改的一部分。在应用程序的某些部分,我们选择使用包含Ninject的静态服务定位器。这实际上只是一个静态适配器。
当我通过我们的服务定位器请求IEnumerable<IFoo>
时,它只需通过Ninject的GetAll
方法请求相同的内容。我想知道的是因为我实际上没有枚举列表,所有服务都将保持不活动状态。
我问的原因是我们正在使用Ninject替换WinForms应用程序中的旧控制器定位器。其中一些控制器是毛茸茸的,所以我不希望它们激活,直到我过滤到我想要的那个。我们如何做到这一点是将Where
子句应用于服务定位器上的集合,然后使用FirstOrDefault选择正确的子句。
我的理解是激活会在枚举上发生(在我们的情况下是FirstOrDefault
)这是正确的吗?
答案 0 :(得分:1)
你是正确的,GetAll
实际上并没有做任何事情,直到你以某种方式枚举它。当您要求IEnumerable
时,每个项目都会将其生效 - 即使它即将被Where
过滤(如果涉及IQueryable
,唯一可能的方式)。
每个项目已激活,将根据normal scoping rules停用。
避免这种情况的最佳方法是使用。当......或其他条件规定过滤时。
请勿阅读过这个要点 - 以后的建议很糟糕。
疯狂的黑客是请求IEnumerable<Lazy<T>>
(这将需要Ninject.Extensions.Factory
)。 Good related article