使用LightInject时,如何在初始注册/引导之外的上下文中使用Container实例?我跟着LightInject的getting started guide并谷歌四处走动,但没有找到类似的东西。
作为参考,我将介绍如何在另外两个IoC框架中实现这一目标。
当使用Ninject时,我习惯将IKernel类型自动绑定到Kernel(LighInject上的Container),所以一个带有这样的构造函数的类:
public MyClass(IKernel kernel)
{
var myInstance = kernel.Get<IMyType>();
}
将能够使用内核来检索实例。
当使用MvvmLight附带的SimpleIoC框架时,您可以使用静态属性(SimpleIoC.Default)来实现相同的目的:
var myInstance = SimpleIoc.Default.GetInstance<IMyType>();
答案 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