C# MVVMCross Messenger-订阅静态类中的消息

C# MVVMCross Messenger-订阅静态类中的消息,c#,xamarin,xamarin.ios,mvvmcross,C#,Xamarin,Xamarin.ios,Mvvmcross,我只是想实现一个MVVMCross Messenger解决方案,使我能够在从iOS应用程序或PCL发布信息时将信息上传到Google Analytics 我遇到的问题是,在我发布之后,订阅Delgate没有被触发。您可以从静态类订阅MVVMCross Messenger订阅吗 静态类中的订阅 public static class GoogleAnalyticsWrapper //: IDisposable { private const string TrackingId = "xxx

我只是想实现一个MVVMCross Messenger解决方案,使我能够在从iOS应用程序或PCL发布信息时将信息上传到Google Analytics

我遇到的问题是,在我发布之后,订阅Delgate没有被触发。您可以从静态类订阅MVVMCross Messenger订阅吗

静态类中的订阅

public static class GoogleAnalyticsWrapper //: IDisposable
{
    private const string TrackingId = "xxxxxxxxxxx";

    private static readonly IMvxMessenger messenger;
    private static readonly MvxSubscriptionToken screenNameToken;
    private static  readonly MvxSubscriptionToken eventToken;
    private static  readonly MvxSubscriptionToken exceptionToken;
    private static  readonly MvxSubscriptionToken performanceToken;
    private static  readonly MvxSubscriptionToken publishToken;
    private static  bool disposed = false;
    private static  SafeHandle handle;

    static GoogleAnalyticsWrapper()
    {
        Gai.SharedInstance.DispatchInterval = 60;
        Gai.SharedInstance.TrackUncaughtExceptions = true;

        Gai.SharedInstance.GetTracker(TrackingId); 

        messenger = new MvxMessengerHub();// Mvx.Resolve<IMvxMessenger>();
        screenNameToken = messenger.Subscribe<GaScreenNameMessage>((m) => SetScreenName(m));

        int count = messenger.CountSubscriptionsFor<GaScreenNameMessage>();

        eventToken = messenger.Subscribe<GaEventMessage>(CreateEvent);
        exceptionToken = messenger.Subscribe<GaExceptionMessage>(CreateException);
        performanceToken = messenger.Subscribe<GaPerformanceTimingMessage>(CreatePerformanceMetric);
        publishToken = messenger.Subscribe<GaPublishMessage>(PublishAll);
    }

    public static string Dummy { get; set; }

    public static void SetScreenName(GaScreenNameMessage message) 
    {
        System.Diagnostics.Debugger.Break();
        Gai.SharedInstance.DefaultTracker.Set(GaiConstants.ScreenName, message.ScreenName);
        Gai.SharedInstance.DefaultTracker.Send(DictionaryBuilder.CreateScreenView().Build());
    }

    public static  void CreateEvent(GaEventMessage message) 
        => Gai.SharedInstance.DefaultTracker.Send(DictionaryBuilder.CreateEvent(message.Category, message.Action, message.Label, message.Number).Build());

    private static  void CreateException(GaExceptionMessage message) 
        => Gai.SharedInstance.DefaultTracker.Send(DictionaryBuilder.CreateException(message.ExceptionMessage, message.IsFatal).Build());

    private static  void CreatePerformanceMetric(GaPerformanceTimingMessage message)
        => Gai.SharedInstance.DefaultTracker.Send(DictionaryBuilder.CreateTiming(message.Category, message.Milliseconds, message.Name, message.Label).Build());

    private static  void PublishAll(GaPublishMessage message) 
        => Gai.SharedInstance.Dispatch();

    public static  void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }

    private void Dispose(bool disposing)
    {
        if (!disposed)
        {
            if (disposing)
            {
                // Dispose managed resources.
                if (handle != null)
                {
                    handle.Dispose();
                }
            }

            // Dispose unmanaged managed resources.
            disposed = true;
        }
    }
}
公共静态类GoogleAnalyticsWrapper/:IDisposable
{
private const string TrackingId=“xxxxxxxxxx”;
专用静态只读IMvxMessenger messenger;
私有静态只读MvxSubscriptionToken screenNameToken;
私有静态只读MvxSubscriptionToken eventToken;
私有静态只读MvxSubscriptionToken exceptionToken;
私有静态只读MvxSubscriptionToken performanceToken;
私有静态只读MvxSubscriptionToken publishToken;
私有静态bool=false;
私人静电安全手柄;
静态GoogleAnalyticsWrapper()
{
Gai.SharedInstance.DispatchInterval=60;
Gai.SharedInstance.TrackUncaughtExceptions=true;
Gai.SharedInstance.GetTracker(TrackingId);
messenger=new MvxMessengerHub();//Mvx.Resolve();
screenNameToken=messenger.Subscribe((m)=>SetScreenName(m));
int count=messenger.CountSubscriptionsFor();
eventToken=messenger.Subscribe(CreateEvent);
exceptionToken=messenger.Subscribe(CreateException);
performanceToken=messenger.Subscribe(CreatePerformanceMetric);
publishToken=messenger.Subscribe(PublishAll);
}
公共静态字符串伪{get;set;}
公共静态无效设置屏幕名称(气体屏幕消息)
{
System.Diagnostics.Debugger.Break();
Gai.SharedInstance.DefaultTracker.Set(GaiConstants.ScreenName,message.ScreenName);
Gai.SharedInstance.DefaultTracker.Send(DictionaryBuilder.CreateScreateScreenView().Build());
}
公共静态void CreateEvent(GaEventMessage消息)
=>Gai.SharedInstance.DefaultTracker.Send(DictionaryBuilder.CreateEvent(message.Category、message.Action、message.Label、message.Number.Build());
私有静态void CreateException(GaExceptionMessage消息)
=>Gai.SharedInstance.DefaultTracker.Send(DictionaryBuilder.CreateException(message.ExceptionMessage,message.IsFatal.Build());
专用静态void CreatePerformanceMetric(GAPerformanceTimeingMessage)
=>Gai.SharedInstance.DefaultTracker.Send(DictionaryBuilder.CreateTimming(message.Category,message.millizes,message.Name,message.Label.Build());
私有静态void PublishAll(GaPublishMessage消息)
=>Gai.SharedInstance.Dispatch();
公共静态void Dispose()
{
处置(真实);
总干事(本);
}
私有无效处置(bool处置)
{
如果(!已处置)
{
如果(处置)
{
//处置托管资源。
if(句柄!=null)
{
handle.Dispose();
}
}
//处置非托管资源。
这是真的;
}
}
}
出版

messengerService.Publish<GaEventMessage>(new GaEventMessage(this, "Event", "Publish Event", "Publish Event From First View Model", 123));
messengerService.Publish(新的GaEventMessage(此“事件”、“发布事件”、“从第一视图模型发布事件”,123));

问题是,您正在静态类中创建一个新的
MvxMessengerHub
,但是(我猜)在消费类中注入
IMvxMessenger
,它是由MvvMCross在初始化生命周期中创建的,因此是另一个实例

简单的解决方法是在你的App.cs中初始化它

public class App : Cirrious.MvvmCross.ViewModels.MvxApplication
{
    public override void Initialize()
    {
        // ...

        var m = Cirrious.CrossCore.Mvx.Resolve<IMvxMessenger>();
        GoogleAnalyticsWrapper.Initialize(m); 
        // ...
    }
}
必须在你的应用程序中注册

Mvx.LazyConstructAndRegisterSingleton<ITrackingService, GoogleAnalyticsTrackingService>();

有了它,如果您的利益相关者决定切换到adobe omniture或其他任何东西,您就可以对其进行单元测试并轻松地交换跟踪服务。

问题是,您正在静态类中创建一个新的
MvxMessengerHub
,但是(我猜)在您的消费类中注入
IMvxMessenger
,该类由MvvMCross在初始化生命周期期间创建,因此是另一个实例

简单的解决方法是在你的App.cs中初始化它

public class App : Cirrious.MvvmCross.ViewModels.MvxApplication
{
    public override void Initialize()
    {
        // ...

        var m = Cirrious.CrossCore.Mvx.Resolve<IMvxMessenger>();
        GoogleAnalyticsWrapper.Initialize(m); 
        // ...
    }
}
必须在你的应用程序中注册

Mvx.LazyConstructAndRegisterSingleton<ITrackingService, GoogleAnalyticsTrackingService>();

有了它,如果您的利益相关者决定改用adobe omniture或其他什么工具,您就可以轻松地对其进行单元测试和交换跟踪服务。

谢谢,这不是解决问题的完美方法,但却让我摆脱了被困的兔子洞。谢谢,这并不是解决这个问题的完美方法,但它让我走出了被困的兔子洞。
class MyViewModel : MvxViewModel 
{
    public MyViewModel(ITrackingService tracking)
    {
         tracking.CreateEvent(new GaEventMessage(this, "Event", "Publish Event", "Publish Event From First View Model", 123));
    }
}

// or
class MyViewModel : MvxViewModel 
{
    public MyViewModel()
    {
         var tracking = Mvx.Resolve<ITrackingService>();
         tracking.CreateEvent(new GaEventMessage(this, "Event", "Publish Event", "Publish Event From First View Model", 123));
    }
}
interface ITrackingService
{
    void CreateEvent(string eventName, string title, string message, params object[] additionalParams);
    // ...
} 

// call:
tracking.CreateEvent("Event", "Publish Event", "Publish Event From First View Model", 123);