用Prism传递同步消息

本文关键字:同步 消息 Prism | 更新日期: 2023-09-27 18:13:47

在我们的prism应用程序中,当用户单击树(单独的模块)中的一个项时,我们需要将一个模块加载到中心窗格。中间窗格中的模块(比如设计器模块)可以打开文件并显示自己,如果它被给定了路径。我如何将文件的路径传递给这个模块?例如

设计器模块

public DesignerViewModel(DataAccess dataAccess)// This will be injected
{
}

//The following class can create the model objects using the IDataService for getting data from remote location
public DataAccess(IDataService service)//this will be injected 
{
}

数据访问对象是Designer模块的本地对象,所以我不想将它暴露给模块外部。注册在

模块中完成
public class DesignerModule : IModule
 {
       public void Initialize()
        {
            var container = ServiceLocator.Current.GetInstance<IUnityContainer>();
            container.RegisterType<Object, DesignerView>("DesignerUI");
            container.RegisterType<DataAccess>();             
        }
   }

IDataService在应用程序级别注册

  public class BootStrapper : UnityBootstrapper
  { 
       protected override void ConfigureContainer()
       {
            base.ConfigureContainer();
            Container.RegisterType<IDataService, DataService>();
       }
  }

请注意,IDataService是整个应用程序的单例。我不能传递特定于IDataService中模块实例的文件路径。请注意,您可以在中心窗格中打开任意数量的模块,只需单击树项目->树将触发具有所选项目id的事件->app将找到与项目id对应的路径并调用模块。

当我说_regionManager时,我将如何传递路径?AddToRegion("CenterRegion",DesignerModule);Prism将完美地完成所有依赖注入,但如何传递路径是一个大问题?

用Prism传递同步消息

你可以使用EventAggregator在模块之间交换消息。每个模块都订阅EventAggregator。当你打开一个模块时,你可以向主机控制发送关于新生儿的通知。主机控制发送响应返回初始化数据。

public class MessageEvent : CompositePresentationEvent<Message>{}
internal class MessageReceiver
{
    private readonly MessageEvent _evt;
    private readonly string _myId = Guid.NewGuid().ToString();
    internal MessageReceiver(IEventAggregator eventAggregator)
    {
        _evt = eventAggregator.GetEvent<MessageEvent>();
        _evt.Subscribe(Receive, true);
        _evt.Publish(new Message { Source = _myId, Command = Message.Commands.WhoIAm });
    }
    public void Receive(Message message)
    {
        switch (message.Command)
        {
            case Message.Commands.WhoIAm:
                _evt.Publish(
                    new Message
                    {
                        Destination = message.Source,
                        Command = Message.Commands.Initialize,
                        MessageData = Encoding.UTF8.GetBytes("init data")
                    });
                break;
            case Message.Commands.Initialize:
                if (message.Destination == _myId)
                {
                    //init
                }
                break;
        }
    }
}
public class Message
{
    public enum Commands { Initialize, WhoIAm }
    public string Source { get; set; }
    public string Destination { get; set; }
    public Commands Command { get; set; }
    public byte[] MessageData { get; set; }
}

我从同事那里找到了答案。在调用Resolve()时,可以用自己的对象覆盖参数。所以创建将要被注入的对象,填充它并用Resolve<>()传递ParameterOverride。在google中搜索ParameterOverride获取更多信息