在IoC(构造函数注入)中,何时注入的构造函数';的实例已创建
本文关键字:构造函数 注入 实例 创建 IoC 何时 | 更新日期: 2023-09-27 17:58:08
这是演示我的问题的示例代码。为了简单起见,我删除了其他不相关的代码。
public class ViewModelLocator
{
static ViewModelLocator()
{
ServiceLocator.SetLocatorProvider(() => SimpleIoc.Default);
if (ViewModelBase.IsInDesignModeStatic)
{
SimpleIoc.Default.Register<IDataService, DesignDataService>();
}
else
{
SimpleIoc.Default.Register<IDataService, DataService>();
}
SimpleIoc.Default.Register<MainViewModel>();
}
public MainViewModel Main
{
get
{
return ServiceLocator.Current.GetInstance<MainViewModel>();
}
}
}
根据我在上面代码中的理解,如果应用程序处于设计模式,当方法/构造函数需要IDataService类型的参数时,DesignDataService的实例将作为参数传递,否则将作为DataService实例传递。现在,我的问题是IDataService类型的实例是什么时候创建的?IDataService类型的对象的构造函数中是否可能有参数?
PS:我对wpf、MVVM模式和Ioc的概念都很陌生。所以请简单地解释一下。谢谢
实例是延迟创建的,因此它是在您第一次访问时创建的。在某种程度上,它的工作原理类似于辛格尔顿模式。但是,所有服务都在同一个服务定位器中进行管理。
这里有一个简单的定位器,减去参数保护:
public static class Locator
{
private static Dictionary<Type, Lazy<object>> _cache = new Dictionary<Type, Lazy<object>>();
public static void Register<TService, TProvider>()
where TService : TProvider
where TProvider : new()
{
_cache.Add(typeof(TService), new Lazy<object>(() => new TProvider()));
}
public static TService GetInstance<TService>()
{
return (TService)_cache[typeof(TService)].Value;
}
}
对于参数化构造函数,您可以这样注册它们:
SimpleIoc.Default.Register<IService>(() => new RealService(param1, param2));