使用LighInject访问Container实例

时间:2018-03-13 14:58:25

标签: c# dependency-injection ioc-container light-inject

使用LightInject时,如何在初始注册/引导之外的上下文中使用Container实例?我跟着LightInject的getting started guide并谷歌四处走动,但没有找到类似的东西。

作为参考,我将介绍如何在另外两个IoC框架中实现这一目标。

Ninject

当使用Ninject时,我习惯将IKernel类型自动绑定到Kernel(LighInject上的Container),所以一个带有这样的构造函数的类:

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

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

SimpleIoC

当使用MvvmLight附带的SimpleIoC框架时,您可以使用静态属性(SimpleIoC.Default)来实现相同的目的:

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

1 个答案:

答案 0 :(得分:0)

短篇小说

LightInject没有开箱即用。

精化

执行此操作意味着ServiceLocator类似于大多数人(LightInject创建者所包含的),将其视为必须避免的anty模式。我们的想法是在启动期间专门使用ServiceContainer(或ninject上已知的内核)。

我对它的看法

在我的情况下,我有一个带有MvvmLight的WPF应用程序。我想遵循这个库提升的ViewModelLocator方法,这几乎需要一个ServiceLocator。

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

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

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

How to handle dependency injection in a WPF/MVVM application