Могут ли концепции 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.