所以我的公司来自一个完全C#.Net的环境,所以很自然地我们正在寻找Mono用于移动开发。我们有一个非常广泛的Windows平台库,我可以将其作为Android类库移植。我的想法是这个Android类库将成为我们的移动平台库,可以在未来重用MonoTouch(尚未经过测试,但只要没有Android特定代码,就可以读到MonoTouch项目可以引用Android类库)。但是在库中,有很多日志语句,对于Windows环境来说,最终只是跟踪语句(包含在自定义助手类中)。我们希望保留日志记录语句并基于当前环境(iOS或Android),只需将其转换为本机日志记录。
我计划对移动平台库中的日志记录使用部分声明,并让Android和iOS特定库包含这些部分日志记录方法的实现。但是当我意识到部分组件在组件之间不起作用时,这种情况就会崩溃。
所以现在我不知道该怎么做。如果有两个独立的iOS和Android平台库并链接相同的文件,我唯一能想到的就是。 (Xamarin可能有一个日志类来执行此操作,但我们仍需要为任何其他未来的抽象提出模式)
任何建议表示赞赏。我们仍处于试验/规划阶段,因此我们可能会忽视某些事情,如果情况确实如此,请告诉我们。
感谢。
修改的
假设我有以下简单的静态类。
public static class TraceHelper
{
public static void WriteLine(string message)
{
// Validation and preprocessing
Trace.WriteLine(message);
}
}
我在移动平台库中有数百次调用此方法。现在让我说我在我的Android应用程序中引用这个库,有没有办法在不修改库本身的情况下覆盖TraceHelper.WriteLine()的实现?
更新的
我们最终创建了实现缺少的.NET功能的Android和iOS库。只需将本机等效功能包装在同一个.NET命名空间和类中。 EX:
using Android.Util;
namespace System.Diagnostics
{
public static class Trace
{
#region Non-Public Data Members
private const string Tag = "Trace";
#endregion
public static void WriteLine(string message)
{
Log.WriteLine(LogPriority.Verbose, Tag, message);
}
}
}
答案 0 :(得分:2)
在mvvmcross中,我使用接口解决了这个问题。
我已经声明了一个常见的IMvxTrace接口,然后我添加了它的单例实现:
此单例使用基础_realTrace实现。
在droid上,_realTrace是:
在触摸时,_realTrace是:
同样,在wpf,win8和wp
上有自定义实现我使用文件链接(在master中)完成了这项工作,但最近使用了PCL和平台特定库的混合。我的个人首选项适用于PCL,因为我喜欢使用重构工具 - 这些使用PCL比使用#if代码更好。此外,随着我将代码从1个增加到6个平台,我发现6套#if语句太复杂而无法维护。
请注意,上面的代码也使用依赖注入和IOC技术。我发现这对跨平台代码共享非常有用。有几个可移植的IOC库,包括tinyioc,xplatutils,opennetcf和mvvmcross的简单IOC。
答案 1 :(得分:0)
解决此问题的最简单方法是设置一个iOS项目,您基本上可以这样做:
public static class TraceHelper
{
public static void WriteLine(string message)
{
#if MONOTOUCH
Console.WriteLine(message);//or something else
#else
Trace.WriteLine(message);
#endif
}
}
您将创建一个MonoTouch类库项目并“链接”原始Mono for Android项目中的所有文件。然后,您可以设置MONOTOUCH
编译器标志,以便在需要时具有特定的iOS或Android代码。
我们一直采用这种方法,并且更喜欢有时而不是使用PCL(便携式类库),因为它具有灵活性。