6

Я не уверен, что поверхности TPL достаточно для того, чтобы это было жизнеспособным, и поэтому не стесняйтесь просто указывать альтернативные шаблоны, которые работают вместо этого. :)ninject (или другой IoC) с областью задач?

Я пытаюсь выяснить, могу ли я использовать Ninject для зависимых от ctor зависимостей, которые в идеале должны быть привязаны к определенному корневому/родительскому экземпляру задачи.

Это похоже на область запроса asp.net, но в этом случае это консольное приложение, которое создает N разных задач, которые будут выполняться параллельно. Мне интересно, есть ли возможность заставить Ninject выполнять инъекцию зависимостей во время выполнения на основе каждого из этих корневых экземпляров задачи, так что граф объектов, созданный как часть каждой задачи, имеет одни и те же экземпляры данного интерфейса, но различные задачи все имеют отдельные экземпляры.

Спасибо!

[EDIT] продолжает искать, это выглядит как InNamedScope может быть правильный ответ, основанный на описании «определить, что объекты являются широкими возможностями для их зависимостей»

+1

Если я правильно понимаю ваш вопрос, 'InNamedScope' является хорошим выбором. Другой альтернативой является «InCallScope». Это [сообщение в блоге] (http://www.planetgeek.ch/2010/12/08/how-to-use-the-additional-ninject-scopes-of-namedscope/) имеет хорошее обсуждение различий. – neontapir

+0

@neontapir - Я провел некоторое тестирование, и действительно похоже, что InNamedScope сделает трюк красиво для меня. Если вы можете добавить ответ, говорящий так же, как и ваш комментарий, я с радостью соглашусь с ним. :) –

+0

Модератор преобразовал свой ответ в комментарий. Я воссоздаю ответ. – neontapir

ответ

4

Если я понимаю ваш вопрос правильно, InNamedScope - хороший выбор. Другой альтернативой является InCallScope. Это blog post имеет хорошее обсуждение различий:

Названная сфера позволяет определить на привязку, что объект, созданный связывания является областью для других объектов, которые являются частью дерева объекта, который вводится в созданный объект.

Посмотрим, как это работает на примере. Представьте себе, что вы создаете первенствовать, как приложение, которое имеет несколько листов ....

const string ScopeName = "ExcelSheet"; 
Bind<ExcelSheet>().ToSelf().DefinesNamedScope(ScopeName); 
Bind<SheetPresenter>().ToSelf(); 
Bind<SheetCalculator>().ToSelf(); 
Bind<SheetDataRepository>().ToSelf().InNamedScope(ScopeName); 

Здесь SheetDataRepository использует ExcelSheet, который находится в области видимости. Статья объясняется более подробно.

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