В чем разница между объемом, контекстом и т. д. в Ninject?

Могут ли концепции Ninject область, контекст, именованная привязкаблок активации?) быть разделены и четко объяснены на концептуальном уровне?

Например, у меня есть служба, которая загружает записи данных из базы данных и для каждой записи создает «воркер» через расширение фабрики Ninject. И служба, и отдельные рабочие роли используют контекст объекта Entity Framework для взаимодействия с базой данных. ObjectContext внедряется через конструктор в оба (а также в другие общие зависимости). В настоящее время он является однопоточным, но в конечном итоге рабочие процессы должны запускаться в своих собственных потоках параллельно, поэтому им потребуется собственный экземпляр ObjectContext и явный жизненный цикл start/dispose. Экземпляр ObjectContext должен быть общим на время «единицы работы» рабочего процесса (и поэтому не является временным, поскольку он внедряется в несколько репозиториев, используемых рабочим процессом). Я застрял, пытаясь получить эту функциональность.

Я наивно хотел что-то подобное (используя именованную область и сохранение контекста):

Bind<MyDbContext>().ToSelf();
Bind<MyService>().ToSelf();

Bind<IWorkerFactory>().ToFactory().InThreadScope();  // scope prob not necessary

Bind<MyWorker().ToSelf().DefinesNamedScope("workerScopeName");
Bind<MyDbContext>().ToSelf().InNamedScope("workerScopeName");

Это очевидно (по крайней мере, очевидно для пользователей Ninject) приводит к ошибке «Более одной совпадающей привязки ...» из-за MyDbContext. Прочитав намного больше, я теперь думаю, что мне, вероятно, следует использовать именованные привязки для исполнителя и его ObjectContext. Я думаю, что мне по-прежнему нужна область действия, чтобы я мог явно удалять ObjectContext после завершения рабочего процесса (и имеет метод удаления из обработки области действия ninject).

В любом случае, я все еще в основном догадываюсь, и я публикую этот вопрос в надежде, что кто-то сможет прояснить эти концепции в Ninject.


person kaliatech    schedule 29.01.2013    source источник


Ответы (1)


Контекст: метаданные для текущего решения. Он указывает, куда в дереве объектов будет внедрен текущий разрешенный объект. (например, текущий разрешенный объект будет введен в конструктор класса A, который вводится в класс B, ....) Его можно использовать, например, для решения, применяется ли привязка в текущем контексте, используя одну из перегрузок When . Он также передается многим другим обратным вызовам с плавным синтаксисом (например, InScope, OnActivation, ....)

Область. Определяет жизненный цикл объекта и возможность повторного использования существующего экземпляра. Существует множество предопределенных областей, а также общая область, в которой можно указать область действия из текущего контекста (InScope(ctx => ...).

Именованная привязка: метаинформация о привязке. Может использоваться в сочетании с контекстом. Например. Привязка применяется только тогда, когда в текущем контексте любая из родительских привязок имеет какое-либо имя.

Блокировка активации: (начиная с Ninject 2.x - 3.x, это, вероятно, изменится в будущих версиях). В блоке активации каждая привязка изменяется, чтобы иметь блок активации в качестве области действия. Это означает, что область, указанная в привязке, будет игнорироваться. Для разрешения одного блока активации будет создан ровно один экземпляр.

Лично я бы не стал использовать эту функцию, потому что она несовершенна из-за игнорирования всех других областей, таких как InSingletonScope. Лучше используйте области, заданные Ninject.Extensions.NamedScope.

Что касается вашего примера: поскольку у вас есть две привязки MyDbContext, вам нужно будет добавить к ним условия. например WhenAnyAncestorNamed. Или вы можете использовать другой Scope, например InCallScope(), только с одной привязкой.

person Remo Gloor    schedule 30.01.2013
comment
Спасибо, это помогает. Можете ли вы добавить информацию о блоках активации и о том, как они связаны (или нет) с контекстом и областью действия? (Кроме того, будущие читатели этого ответа могут обнаружить, что ссылка на дочерние ядра сделает этот ответ полным.) Я просмотрел всю вики ninject, но трудно определить, что актуально, а что нет. - person kaliatech; 30.01.2013