0

使用 LightInject 时,如何在初始注册/引导之外的上下文中访问容器实例?我按照 LightInject 的入门指南 和谷歌搜索,但没有找到类似的东西。

作为参考,我介绍了如何在其他两个 IoC 框架中实现这一点。

忍者

使用 Ninject 时,我习惯于将 IKernel 类型自动绑定到内核(LighInject 上的容器),因此具有如下构造函数的类:

public MyClass(IKernel kernel)
{
    var myInstance = kernel.Get<IMyType>();
}

将能够使用内核来检索实例。

简单IOC

在使用 MvvmLight 自带的框架 SimpleIoC 时,可以使用静态属性(SimpleIoC.Default)来达到同样的目的:

var myInstance = SimpleIoc.Default.GetInstance<IMyType>();
4

1 回答 1

0

短篇故事

LightInject 没有提供开箱即用的东西。

细化

这样做意味着 ServiceLocator 类型的东西,大多数人,包括 LightInject 的创建者,都将其视为必须避免的反模式。这个想法是在启动期间专门使用 ServiceContainer(或在 ninject 上已知的内核)。

我的看法

就我而言,我有一个带有 MvvmLight 的 WPF 应用程序。我想遵循这个库推广的 ViewModelLocator 方法,这几乎需要 ServiceLocator 之类的东西。

在 MvvmLight 上,ViewModelLocator 应该保存每个 ViewModel 的实例,并且应该设置为 App.xaml 文件中的资源。这意味着 ViewModelLocator 绝对需要一个无参数的构造函数,这使得使用 IoC 框架绑定引用变得不可能。

我的解决方案是创建一个 Singleton 来公开 ServiceContainer,以便可以从 ViewModelLocator 引用它来为 ViewModel 提供实例。

以下讨论非常有趣,并为我提供了关于这个问题的不同观点:

如何在 WPF/MVVM 应用程序中处理依赖注入

于 2018-03-14T14:15:06.943 回答