用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将完美地完成所有依赖注入,但如何传递路径是一个大问题?
你可以使用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获取更多信息