我应该如何在mvvmcross中扩展MvxTrace?

时间:2014-08-26 16:29:56

标签: xamarin mvvmcross

我已经实现了IMvxTrace的特定实现,它可以记录到文件和控制台,并且它正常工作。但我现在要做的是添加一个可以用来记录例外的新方法,所以我想在接口上添加一个方法签名。

我正在考虑做这样的事情:

public interface IMvxTraceExt : IMvxTrace
{
    void LogException(Exception ex);
}

只是创建一个实现它的对象,当然,当我最终创建对象并在CreateDebugTrace中返回它时,它会丢失扩展接口定义:

protected override IMvxTrace CreateDebugTrace()
{
    return new DebugTrace();
}

这并不奇怪......总的来说,目标是拥有它以便我可以在代码中执行以下操作:

MvxTrace.TaggedError("Setup", "registering unhandled exception logging");
AppDomain.CurrentDomain.UnhandledException += (sender, e) => {        
    var trace = MvxTrace.Instance as IMvxTraceExt;
    trace.LogException(e.ExceptionObject as Exception);
};

以上,'追踪'在演员阵容中变为零 - 所以演员不会按照我的想法行事。真的,我的偏好就是能够像MvxTrace一样直接点击方法:

MvxTrace.TaggedError("Setup", "registering unhandled exception logging");
AppDomain.CurrentDomain.UnhandledException += (sender, e) => {        
    MvxTrace.LogException(e.ExceptionObject as Exception);
};

但这意味着MvxTrace本身需要是一种实现扩展mvxtrace接口的类型,除了调整我自己并不真正想要的源代码之外,我还没有看到这样做的方法。要做。

旁注:我希望在实现其他跟踪功能的同一对象中使用LogException的原因是因为我已经拥有管理附加到其中的日志文件的代码,并且以这种方式扩展它似乎很自然。

思想?

1 个答案:

答案 0 :(得分:2)

MvxTrace本身只是一组静态辅助方法,可以使对实际IMvxTrace实现的调用更简洁,并且作为优化 - MvxTrace充当单例以避免查找为每个跟踪调用提供IMvxTrace作为服务。

因为帮助者是static,所以覆盖该类并改变行为并不容易。

根据您的要求,您可以声明一个额外的TraceEx静态类来帮助:

public class MyTrace
{
   private static IMvxTraceExt _traceExt;

   private static IMvxTraceExt TraceExt
   {
      get { return _traceExt ?? _traceExt = Mvx.Resolve<IMvxTrace>() as IMvxTraceExt; }
   }

   public static void LogException(Exception exc)
   {
       TraceExt.LogException(exc):
   }
}

这可能看起来很麻烦......但它只需要完成一次 - 而且我经常添加一个特定于应用程序的静态跟踪类 - 因为它有助于确保跟踪Tag日志记录的一致性 - 例如见https://github.com/MvvmCross/MvvmCross-Tutorials/blob/master/Sample%20-%20CirriousConference/Cirrious.Conference.Core/Trace.cs

相关问题