2013-05-20 6 views
2

Мы используем Ninject в качестве части модификации нашей унаследованной системы. В некоторых частях приложения мы решили использовать статический локатор сервисов, который обертывает Ninject. Это действительно только статический адаптер.В какой момент происходит активация сервисов в Ninject при запросе IEnumerable

Когда я запрашиваю IEnumerable<IFoo> через наш Сервисный Локатор, он просто запрашивает то же самое с помощью метода Ninject GetAll. Я хотел бы знать, так как я фактически не перечислял список, все службы останутся бездействующими.

Причина, по которой я прошу, заключается в использовании Ninject для замены старого локатора контроллера в приложении WinForms. Некоторые из этих контроллеров выглядят волосатыми, поэтому я не хочу, чтобы они активировались, пока я не отфильтровывался до того, что я хочу. Как мы это делаем, применяем предложение Where к коллекции на локаторе службы, а затем используя FirstOrDefault, чтобы выбрать правильный.

Мое понимание, что активация произойдет при перечислении (в нашем случае на FirstOrDefault), это правильно?

ответ

1

Вы правы, что GetAll на самом деле ничего не делает, пока вы не перечислите его каким-либо образом. Когда вы запрашиваете IEnumerable, каждый вытащенный предмет оживляет его - даже если он собирается быть отфильтрован Where (единственный способ, который мог бы произойти, если были задействованы IQueryable).

Каждый элемент активирован, будет деактивирован в соответствии с normal scoping rules.

Лучшим способом избежать этого является наличие ... или другого условия, определяющего фильтрацию.


НЕ ЧИТАЙТЕ за эту точку - BAD КОНСУЛЬТАЦИИ СЛЕДУЮЩЕЙ.

Сумасшедший взлом должен запросить IEnumerable<Lazy<T>> (что потребует Ninject.Extensions.Factory). Good related article.

+0

Извините, меня не было на мгновение, отдано. – McDonnellDean

 Смежные вопросы

  • Нет связанных вопросов^_^