2013-05-20 57 views
2

我們正在使用Ninject作爲我們遺留系統修改的一部分。在應用程序的某些部分,我們選擇使用靜態服務定位器來包裝Ninject。這實際上只是一個靜態適配器。Ninject在請求IEnumerable時發生服務激活的幾點

當我通過我們的服務定位器請求IEnumerable<IFoo>時,它只需通過Ninject的GetAll方法請求相同的方法。我想知道的是,因爲我沒有實際列舉清單,所有服務都將保持不活動狀態。

我問的原因是我們使用Ninject來替換WinForms應用程序中的舊控制器定位器。其中一些控制器很毛茸茸的,所以我不希望它們激活,直到我篩選出我想要的。我們如何做到這一點是將Where子句應用於服務定位器上的集合,然後使用FirstOrDefault選擇正確的子集。

我的理解是激活會發生在枚舉上(在我們的案例中是FirstOrDefault)這是正確的嗎?

回答

1

你是對的,GetAll實際上沒有做任何事情,直到你以某種方式枚舉它。當您要求輸入IEnumerable時,每個項目都會使其生效 - 即使它將要被Where篩選(唯一的方法是如果涉及IQueryable)。

每個項目已激活,將被取消激活,符合normal scoping rules

要避免這種情況,最好的方法是讓一個.When ......或其他條件指示過濾。


不要讀通過該點 - 糟糕的建議如下。

一個瘋狂的黑客是要求IEnumerable<Lazy<T>>(這將需要Ninject.Extensions.Factory)。 Good related article

+0

對不起,我不在一個咒語,upvote給出。 – McDonnellDean

相關問題