Синхронизированная передача сообщений с Призмой - PullRequest
0 голосов
/ 07 ноября 2011

В нашем приложении призмы нам нужно загрузить модуль в центральную панель, когда пользователь щелкает элемент в дереве (отдельный модуль).Модуль в центральной панели (скажем, модуль конструктора) может открывать файл и отображать себя, если ему указан путь.Как я могу передать путь файла к этому модулю?Например,

в модуле 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.Обратите внимание, что вы можете открыть любое количество модулей в центральной панели, как вам угодно, просто нажмите на элемент дерева -> дерево вызовет событие с выбранным идентификатором элемента -> приложение найдет путь, соответствующий идентификатору элемента, и вызоветмодуль.

Как мне пройти путь, когда я скажу _regionManager.AddToRegion ("CenterRegion", DesignerModule);Prism прекрасно выполнит все инъекции зависимостей, но как пройти путь - большой вопрос?

Ответы [ 2 ]

0 голосов
/ 09 ноября 2011

Я узнал ответ от моего коллеги. Параметры можно переопределить вашими собственными объектами, когда вы вызываете Resolve (). Итак, создайте объект, который будет введен, заполните его и передайте Resolve <> () с ParameterOverride. Поиск ParameterOverride в Google для получения дополнительной информации.

0 голосов
/ 07 ноября 2011

Вы можете использовать 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; }
}
...