Доступ к экземпляру контейнера с помощью LighInject
При использовании LightInject, как вы можете использовать доступ к экземпляру контейнера в контекстах, отличных от начальной регистрации / начальной загрузки? Я следовал руководству по началу работы с LightInject и гуглял, но ничего подобного не нашел.
Для справки я представляю, как это достигается в двух других платформах IoC.
Ninject
При использовании Ninject я привык автоматически привязывать тип IKernel к ядру (Container on LighInject), поэтому класс с конструктором выглядит так:
public MyClass(IKernel kernel)
{
var myInstance = kernel.Get<IMyType>();
}
сможет использовать ядро для извлечения экземпляров.
SimpleIoC
При использовании SimpleIoC, инфраструктуры, которая поставляется с MvvmLight, вы можете использовать статическое свойство (SimpleIoC.Default) для достижения той же цели:
var myInstance = SimpleIoc.Default.GetInstance<IMyType>();
1 ответ
Короткий рассказ
LightInject не предоставляет ничего подобного.
разработка
Это подразумевает такие вещи, как ServiceLocator, которые большинство людей, включая создателя LightInject, видят как анти-паттерн, которого следует избегать. Идея заключается в том, чтобы ServiceContainer (или Kernel, как известно на ninject) использовался исключительно во время запуска.
Мой взгляд на это
В моем случае у меня есть приложение WPF с MvvmLight. Я хочу следовать подходу ViewModelLocator, продвигаемому этой библиотекой, который в значительной степени требует чего-то вроде ServiceLocator.
В MvvmLight ViewModelLocator должен содержать экземпляры каждого ViewModel, а также должен быть настроен как ресурс в файле App.xaml. Это подразумевает, что ViewModelLocator обязательно должен иметь конструктор без параметров, что делает невозможным использование инфраструктуры IoC для привязки ссылок.
Мое решение состояло в том, чтобы создать Singleton для предоставления ServiceContainer, чтобы на него можно было ссылаться из ViewModelLocator для предоставления экземпляров для ViewModels.
Следующая дискуссия была очень интересной и дала мне разные точки зрения на эту проблему:
Как обрабатывать внедрение зависимостей в приложении WPF/MVVM