Является ли Kernel.Get <T>() потокобезопасным + хорошим шаблоном для разделения ядра между компонентами - PullRequest
9 голосов
/ 14 июня 2011

Kernel.Get () безопасен для потоков?Моя цель - поделиться экземпляром моего ядра между всеми моими компонентами, и все они могут очень хорошо одновременно вызывать Kernel.Get () в разных потоках.

Является ли Kernel.Get () потокобезопасным?

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

Ответы [ 2 ]

14 голосов
/ 14 июня 2011

Get является потокобезопасным, но создание новых экземпляров ядра (ctor) в настоящее время не является потокобезопасным.

Как правило, вы должны попытаться свести к минимуму ваш доступ к ядру.Доступ к форме ядра везде очень плохой дизайн и делает ваш код намного менее пригодным для повторного использования.См. Service Locator Antipattern

Единственные ситуации, когда вы обращаетесь к ядру, должны быть:

  • Один раз в составном корне приложения (например, Program.Main,App.xaml, создание контроллера MVC)
  • Внутри фабрики, если вы не знаете, сколько экземпляров вам нужно при создании составного корня
  • Внутри фабрики, если вы не знаете, какаяреализация требуется при создании составного корня
  • Внутри фабрики, если вам необходимо создать компонент с опозданием из-за ограничений памяти / ресурсов.

Во всех случаях ограничить доступ кЯдро в составной корень и вводить фабрики (класс или Func<T>) в классы, где вам нужно создавать объекты во время выполнения.Лучший способ предоставить этим фабрикам доступ к ядру - это внедрение в конструктор, даже если вы этого не предпочитаете.Или используйте Func<T> ( Поддерживает ли Ninject Func (автоматически сгенерированная фабрика)? ).

2 голосов
/ 14 июня 2011

Да, это потокобезопасный;Основное приложение, над которым я работаю, имеет одно ядро, которое обслуживает большое приложение SAAS.Так что это стучат, и это просто отлично.У нас также есть тестовый набор многопоточных генераторов страниц, который выявил проблему с потоками в Ninject прошлой осенью, но был исправлен и с тех пор исправен.Так что я точно знаю, что все в порядке.

Существует множество различных шаблонов для разоблачения ядра.Мы используем шаблон ServiceLocator (в основном статический контейнер для контейнера.)

Для различных DLL.У нас есть NinjectModule в каждой dll, который выполняет свои собственные привязки, а затем приложение выполняет сканирование сборки для NinjectModules при запуске, когда оно устанавливает ServiceLocator.

...