在IoC(构造函数注入)中,何时创建注入的构造函数实例?

时间:2016-07-21 00:59:49

标签: c# wpf mvvm inversion-of-control

这是一个示例代码,用于演示我的问题。为简单起见,我删除了其他不相关的代码。

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概念的新手。所以请简单解释一下。感谢。

1 个答案:

答案 0 :(得分:0)

实例懒惰地创建,因此它是在您第一次访问时创建的。在某种程度上它像Singleton模式一样工作。但是,所有服务都在同一服务定位器中进行管理。

这是一个简单的定位器减去参数守卫:

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));
相关问题