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#)仍然非常陌生,所以我非常感谢任何代码示例。谢谢!
答案 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
中进行任何更改。