使用带有SimpleIoC的多个IoC容器来实现关注点分离:它是否可行并且有意义吗?

时间:2016-03-08 10:06:45

标签: c# wpf mvvm-light ioc-container

TL;博士

SimpleIoC是否可以使用多个IoC容器来实现与GUI相关的对象(ViewModel等)和与后端代码相关的对象的管理分离?

/ TL;博士

通过使用MvvmLight开始使用WPF,我接触到了SimpleIoc,我将其用作ViewModelLocator。在我的项目中,我现在有一个名为ViewModelLocator的类,它负责返回ViewModel以及绑定到IDataService的DataService。为此我遵循了伟大的Big Mvvm Template at CodeProject

我现在正准备用我的“后端”连接我的GUI,后端包含用于控制外部硬件的代码。我还想使用SimpleIoc来实例化对象,负责控制我的硬件。但是这些显然不是ViewModel,因此ViewModelLocator不是注册这些类的理想IoC实例/位置。

所以我的问题是,是否有可能为这些对象创建SimpleIoC的第二个实例,或者是否有另一种方法可以实现GUI的实例管理和后端的实例管理之间的清晰分离对象?我对IoC的概念(以及C#)仍然非常陌生,所以我非常感谢任何代码示例。谢谢!

1 个答案:

答案 0 :(得分:0)

首先,你不应该使用多个容器,这将使你的生活变得痛苦,因为ViewModelLocator需要解析ViewModel,而ViewModels依赖于你的业务/域服务和/或存储库等。

您只需要允许ViewModelLocator传递委托方法进行解析,这样您的ViewModelLocator就会独立于IoC容器,即

// default implementation can use Activator.CreateInstance that instantiate parameterless viewmodels
// You'll override it to use IoC
private Func<Type, object> resolver = null;
public static void SetResolverFactory(Func<Type, object> factoryMethod) 
{
    if(factoryMethod!=null) 
        throw new ArgumentNullException(nameof(factoryMethod));

    resolver = factoryMethod;
}

// inside your ViewModelLocator
protected T Resolve<T>() 
{
    return (T)resolver(typeof(T));
}

然后在你的引导程序中将解析器设置为SimpleIoC或你使用的任何东西。

例如

// get the singleton instance and set it or just use a static method that wraps around the singleton instance
ViewModelLocator.Instance.SetResolverFactory( type => SimpleIoc.Default.GetInstance(type));

您的视图模型将由SimpleIoC解决。如果您决定切换到antoher IoC容器,只需调用新IoC容器的resolve方法,无需在ViewModelLocator中进行任何更改。