C# MVVMCross Messenger-订阅静态类中的消息
我只是想实现一个MVVMCross Messenger解决方案,使我能够在从iOS应用程序或PCL发布信息时将信息上传到Google Analytics 我遇到的问题是,在我发布之后,订阅Delgate没有被触发。您可以从静态类订阅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
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);