5

私の会社は完全な C# .Net 環境から来ているので、当然、モバイル開発用に Mono を検討しています。非常に広範な Windows プラットフォーム ライブラリがあり、そのほとんどを Android クラス ライブラリとして移植することができました。この Android クラス ライブラリは、MonoTouch で将来再利用できるモバイル プラットフォーム ライブラリになるという考えです (テストしていませんが、Android 固有のコードがない限り、MonoTouch プロジェクトは Android クラス ライブラリを参照できることをお読みください)。ただし、ライブラリ内には、多くのログ ステートメントがあり、Windows 環境ではトレース ステートメントになります (カスタム ヘルパー クラスにラップされます)。ログ ステートメントを保持し、現在の環境 (iOS または Android) に基づいて、それらをネイティブ ログに変換するだけです。

モバイル プラットフォーム ライブラリでのロギングに部分的な宣言を使用し、Android および iOS 固有のライブラリにそれらの部分的なロギング メソッドの実装を含めることを計画していました。しかし、パーシャルがアセンブリ間で機能しないことに気付いたとき、それは崩壊しました。

だから今、私はこれについてどうやって行くのか分かりません。2 つの個別の 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 名前空間とクラスで、ネイティブの同等の機能をラップするだけです。元:

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);
        }
    }
}
4

2 に答える 2

2

mvvmcrossでは、インターフェイスを使用してこれに取り組んできました。

共通のIMvxTraceインターフェイスを宣言し、次のようなシングルトン実装を追加しました。

https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Platform/Diagnostics/MvxTrace.cs

このシングルトンは、基盤となる_realTrace実装を使用します。

ドロイドでは、_realTraceは次のとおりです。

https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Android/Platform/MvxDebugTrace.cs

そして、タッチすると、_realTraceは次のようになります。

https://github.com/slodge/MvvmCross/blob/master/Cirrious/Cirrious.MvvmCross/Touch/Platform/MvxDebugTrace.cs

同様に、wpf、win8、およびwpにはカスタム実装があります

これは、(マスターでの)ファイルリンクを使用して行いましたが、最近では、PCLとプラットフォーム固有のライブラリを組み合わせて使用​​しています。私の個人的な好みは、リファクタリングツールを使用するのが好きなPCLです。これらは、#ifコードよりもPCLの方がはるかにうまく機能します。また、コードを1から6のプラットフォームに拡張すると、6セットの#ifステートメントが複雑すぎて維持できないことがわかりました。

上記のコードも依存性注入とIOC手法を使用していることに注意してください。これは、クロスプラットフォームのコード共有に非常に役立ちます。tinyioc、xplatutils、opennetcf、mvvmcrossの単純なIOCなど、いくつかのポータブルIOCライブラリが利用可能です。

于 2012-12-30T14:47:40.907 に答える
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 (ポータブル クラス ライブラリ) を使用するよりも好んで使用することがあります。

于 2012-12-28T22:33:44.023 に答える