#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.Экземпляр.