将多个 IoC 容器与 SimpleIoC 一起使用以实现关注点分离:是否可能并且是否有意义?

Using multiple IoC containers with SimpleIoC to achieve separation of concerns: Is it possible and does it make sense?

tl;dr

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

/tl;dr

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

我现在准备将我的 GUI 与我的 "backend" 连接起来,其中包含用于控制外部硬件的代码。我还想使用 SimpleIoc 来实例化对象,负责控制我的硬件。然而,这些显然不是 ViewModel,因此 ViewModelLocator 不是注册这些 classes 的理想 IoC instance/location。

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

首先,你不应该使用多个容器,这会让你的生活很痛苦,因为 ViewModelLocator 需要解析 ViewModels,而 ViewModels 依赖于你的 business/domain 服务and/or 存储库等

所有你需要的是让你的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 解析。如果您决定切换到另一个 IoC 容器,您只需调用新 IoC 容器的 resolve 方法,无需在 ViewModelLocator.

中进行任何更改