在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的概念都很陌生。所以请简单地解释一下。谢谢

在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));