使用Prism传递同步消息

时间:2011-11-07 14:31:43

标签: c# unity-container prism

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

在Designer模块中

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的事件 - &gt;应用程序将找到与项目ID对应的路径并调用该模块。

当我说_regionManager.AddToRegion(“CenterRegion”,DesignerModule)时,我将如何传递路径; Prism会很好地完成所有依赖注入,但是如何通过这条道路是个大问题?

2 个答案:

答案 0 :(得分:0)

您可以使用EventAggregator与beetwen模块进行交换。 每个模块都订阅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; }
}

答案 1 :(得分:0)

我找到了同事的答案。调用Resolve()时,可以使用自己的对象覆盖参数。因此,创建将要注入的对象,填充它并使用ParameterOverride与Resolve&lt;&gt;()一起传递。在谷歌搜索ParameterOverride以获取更多信息。