我已经实现了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的原因是因为我已经拥有管理附加到其中的日志文件的代码,并且以这种方式扩展它似乎很自然。
思想?
答案 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