在PRISM WPF应用程序中有一个模块依赖的状态注入



嗨,我们有一个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

最新更新