嗨,我们有一个PRISM WPF MVP应用程序,我们希望有一个状态在同一模块中的视图之间共享数据。由于PRISM默认情况下没有状态,我想知道是否有任何方法可以实现这一点。目前我已经注入了一个状态与字典作为后存储,但问题是它的全局即跨模块可用。我真的想把这个注入的范围定为特定于模块的。
我相信unity允许根据名称将不同的类注册到相同的接口,不确定我唯一的选择是否就是在我的场景中利用它。
任何帮助将是伟大的!谢谢!
-ioWint
我同意,用ModuleName限定Unity的类型注册范围将是一个开始的地方。
在所有想要共享状态的视图中注入一个本地(模块级)状态对象。如果定义状态对象的接口是你模块的本地接口,那么其他模块将无法引用该状态对象,因为它们不能引用该接口。
所以:如果模块A有3个视图,采取一个对象实现IStatefulContainer(也在模块A中声明)和IStatefulContainer注册与Unity使用RegisterInstance而不仅仅是RegisterType,你将有一个单一的范围到模块。
我倾向于使用一个管理状态的"State"服务。这可以让你在这里添加更多的功能,如果你需要的话,这是一个更"Prismy"的方法。
编辑如果你要跨模块使用这个状态对象,那么你可以这样做:
1)将接口放在一个程序集中,任何想要使用它的模块都可以引用它。
组装一个
public interface IBlah
{
string Add(string stateKey, string stateValue);
}
Assembly B (referencing Assembly A)
public class Module:IModule
{
private IUnityContainer _container;
public Module(IUnityContainer container)
{
_container=container;
}
public void Initialize()
{
IBlah blah1=new BlahContainer();
IBlah blah2=new BlahContainer();
_container.RegisterInstance<IBlah>(blah1,"BlahContainer1");
_container.RegisterInstance<IBlah>(blah2,"BlahContainer2");
}
}
模块C(引用汇编A)
_container.Resolve<IBlah>("BlahContainer1");
_container.Resolve<IBlah>("BlahContainer2");
基本上,我们在一个程序集中定义了接口,我们很乐意在模块之间共享。有些项目有"基础设施"或公共程序集,其中包含其他模块使用的服务接口-这在这里很适合。
然后让模块引用包含契约的程序集。
目前我在这里依赖于"魔法字符串",但有很多方法可以解决这个问题。
感谢您更新的解决方案。我试图避免基于名称的Unity注册,这将迫使我的演示者知道模块状态注册键。我正在阅读关于Unity的stackoverflow帖子,并在这里找到了讨论,是否有可能在使用Unity的方法注入时覆盖参数值?。
经过几个小时的试验和错误,我最终实现了所需的功能。
我做了什么:
我有一个BaseClass为我的模块-> BaseModule:IModule我有一个状态属性在它符合我的IStateService定义在Infrastructure.Interface。在BaseModule()构造函数中实例化这个State属性。注意:为了使用这种方法,我必须让我的演示者有一个公共的IStateService状态;财产. .
在模块中注册演示者时,我指定了
<UnityContainer>.RegisterType<MyPresenter, new InjectionProperty("State", State).
我用模块中定义的State实例值重写了Presenter中名为"State"的公共属性。通过这种方式,我可以将模块状态作为每个视图演示者的状态。
谢谢大家指导我找到一个解决方案。
-ioWint