将多个 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
.
中进行任何更改
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
.