Можно ли использовать MvvmCross Messenger без IoC?

#wpf #mvvmcross #eventaggregator

#wpf #mvvmcross #eventaggregator

Вопрос:

Я хотел бы использовать MvvmCross Messenger для отправки сообщений между надстройками, которые я разрабатываю для приложения, источник которого я не могу изменить.

Таким образом, я не вижу четкого способа использовать IoC, поэтому я бы просто запустил свой собственный синглтон.

Однако мой простой тест получает исключение при вызове Subscribe.

     public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            var m = new MvxMessengerHub();
            // exception on Subscribe: 
            // The type initializer for 'MvvmCross.Plugin.Messenger.MvxPluginLog' threw an exception.
            m.Subscribe<TestMessage>((msg) =>
            {
                Debug.Print("got msg");
            });
            m.Publish<TestMessage>(new TestMessage(this));
        }
    }
    public class TestMessage : MvxMessage
    {        
        public TestMessage(object sender): base(sender)
        {
        }
    }
 

Должен ли документ указывать «может только» вместо «может»?

введите описание изображения здесь


Вот трассировка стека:

 The type initializer for 'MvvmCross.Plugin.Messenger.MvxPluginLog' threw an exception.
   at MvvmCross.Plugin.Messenger.MvxPluginLog.get_Instance() in /_/MvvmCross.Plugins/Messenger/MvxPluginLog.cs:line 11
   at MvvmCross.Plugin.Messenger.MvxMessengerHub.SubscribeInternal[TMessage](Action`1 deliveryAction, IMvxActionRunner actionRunner, MvxReference reference, String tag) in /_/MvvmCross.Plugins/Messenger/MvxMessengerHub.cs:line 75
   at MvvmCross.Plugin.Messenger.MvxMessengerHub.Subscribe[TMessage](Action`1 deliveryAction, MvxReference reference, String tag) in /_/MvvmCross.Plugins/Messenger/MvxMessengerHub.cs:line 29
   at WpfApp1.MainWindow.Button_Click(Object sender, RoutedEventArgs e) in D:reposesriarcgis-pro-sdk-cim-viewerWpfApp1MainWindow.xaml.cs:line 40
 

Обновление: я нашел этот тест из чужого проекта 5-летней давности, так что, похоже, это должно было сработать в предыдущей версии.

 public void SubscribeAndPublishAllowsMessageToBeReceived()
{
    var messenger = new MvxMessengerHub();
    var message = new TestMessage(this);

    var messageReceived = false;
    messenger.Subscribe<TestMessage>(m =>
        {
            Assert.That(m, Is.EqualTo(message));
            Assert.That(m.Sender, Is.EqualTo(this));
            messageReceived = true;
        });

    messenger.Publish(message);

    Assert.IsTrue(messageReceived);
}

 

Комментарии:

1. Вы пытались внедрить его из конструктора или разрешить зависимость через Mvx.IoCProvider.Resolve<T> ?

2. Можете ли вы добавить трассировку стека исключения, возникающего при вызове Subscribe?

3. @TrevorBalcom готово

4. @FabriBertani Я не использую IoC, есть ли пример, показывающий, как использовать MvvmCross в библиотеке классов, которая создает dll, которая загружается как плагин в приложении, которое никто не контролирует? Другими словами, я не могу перестроить exe-файл — он принадлежит кому-то другому. Я могу расширить его только с помощью их плагинов.

Ответ №1:

Если вы посмотрите на источник, вы увидите, что MvxMessengerHub ссылается на MvxPluginLog.Экземпляр для записи сообщений журнала. Исключение генерируется, потому MvxPlugingLog.Instance.get что вызывается внутренне MvxMessengerHub в разных точках. MvxPluginLog.Instance.get использует контейнер MvvmCross IoC для разрешения IMvxLogProvider. Вы могли бы предоставить свою собственную реализацию IMvxMessengerHub, которая не использует MvxPluginLog.Экземпляр.