PRISM:使用 MVVM,如何解析或注入构造函数对象
本文关键字:注入 构造函数 对象 何解析 使用 MVVM PRISM | 更新日期: 2023-09-27 18:30:50
我正在使用MVVM和PRISM。在项目中,我有一个名为 IFoo 的通用接口,其他模块应该实现这个接口并注册它。
// Common module
public interface IFoo { }
// Module1 module
public class Foo1 : IFoo { }
然后,当我初始化模块 1 时,我注册我的类型并导航。
_container.RegisterType<IFoo, Foo1>(new ContainerControlledLifetimeManager());
_container.RegisterType<Object, View1>("View1");
var module = new Uri("View1", UriKind.Relative);
_regionManager.RequestNavigate("MainRegion", module);
View1 构造函数包含视图模型,此视图模型在其构造函数中具有:
public ViewModel1(IFoo foo, IEventAggregator eventAggregator, IRegionManager regionManager)
{
...
}
在此之前,没关系。但稍后,我需要从外部模块获取 Foo1。因此,我将另一个注册表设置为Foo1的映射名称:
_container.RegisterType<IFoo, Foo1>(new ContainerControlledLifetimeManager());
_container.RegisterType<IFoo, Foo1>("foo1", new ContainerControlledLifetimeManager());
是的,它对我有用,但我不喜欢将两个实例分开的想法。我只需要有一个,并访问相同的实例。
有没有办法解决这种情况?提前谢谢。
无论如何,我附上了一个 Zip,其中包含一个代表我问题的演示。http://www.mediafire.com/?feod8x0b952457e
加载模块时,可以在引导程序中注册所有类型。
// register all modules
protected override void ConfigureModuleCatalog()
{
// get all module types
var types = new List<Type>();
types.Add(typeof(ModuleA));
types.Add(typeof(ModuleB));
types.Add(typeof(ModuleC));
// register all types
foreach (var type in types)
{
ModuleCatalog.AddModule(new ModuleInfo()
{
ModuleName = type.Name,
ModuleType = type.AssemblyQualifiedName
});
}
}
然后在ConfigureContainer
中映射以后要访问的所有类型和/或实例。配置的容器将传递到模块 1 模块的构造函数中。
// register all types in all modules
protected override void ConfigureContainer()
{
base.ConfigureContainer();
// ModuleA
Container.RegisterType<IInterface1, Type1>();
Container.RegisterType<IInterface2, Type2>();
// ModuleB
Container.RegisterInstance<IInterface3>("name", new Type3());
Container.RegisterType<IInterface4, Type4>();
// ModuleC
Container.RegisterType<IInterface5, Type5>();
Container.RegisterType<IInterface6, Type6>();
}
我认为您不需要注册两次Foo1。您使用的是ContainerControlledLifetimeManager
因此,每当向 Unity 容器请求 IFoo 实例时,它都会为您提供 Foo1 - 您无需使用名称作为键。
因此,在注册 Foo1 module1
_container.RegisterType<IFoo, Foo1>(new ContainerControlledLifetimeManager());
System.Diagnostics.Debug.Print(Foo1.GetHashCode());
在您的外部模块中:
IFoo someFoo = _container.Resolve<IFoo>();
// someFoo is the same object as Foo1, so the hashcodes will be equal.
System.Diagnostics.Debug.Print(someFoo.GetHashCode());