MonoDroidとMonoTouchの共有ライブラリ

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

私は、モバイルプラットフォームライブラリのロギングに部分宣言を使用し、AndroidおよびiOS固有のライブラリにこれらの部分的なロギングメソッドの実装が含まれるようにする予定でした。しかし、パーシャルがアセンブリ間で動作しないことが分かったとき、それは分かれた。

だから私はこれについてどうやって行くのか分からない。 2つの別々のiOSとAndroidプラットフォームのライブラリがあり、同じファイルをリンクしている場合は、私が考えることができる唯一のものです。 (Xamarinにはこれを行うログクラスがあるかもしれませんが、他の将来の抽象化のパターンを考え出す必要があります)

アドバイスをいただければ幸いです。私たちはまだ実験/計画段階にありますので、何かを見落とす可能性があります。その場合は教えてください。

ありがとう。

Edit
Lets say I have the following simple static class.

public static class TraceHelper
{
    public static void WriteLine(string message)
    {
       //Validation and preprocessing
        Trace.WriteLine(message);
    }
}

モバイルプラットフォームライブラリ内にこのメソッドを何百回も呼び出す必要があります。今、Androidアプリケーションでこのライブラリを参照していますが、ライブラリ自体を変更せずにTraceHelper.WriteLine()の実装をオーバーライドする方法はありますか?

Update
We ended up creating Android and iOS libraries that implemented the missing .NET functionality. Just wrap the native equivalent functionality, in the same .NET namespace and class. 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);
        }
    }
}
5
nl ru de
クリス - 100%あなたのコメントに同意する - あなたは答えとしてそれを書く必要があります。
追加された 著者 Stuart,
ロギングステートメントを変更したくないので具体的なアドバイスを提供できるかどうかは不明です。私の会社では、Windows/Silverlight/Android/Unity3Dの間でコードを共有していますが、私たちは再利用可能なインターフェイスでロギング実装を抽象化しました。アプリケーションのブートストラップの一環として、プラットフォーム固有のロガーをバックグラウンドで追加します。したがって、ロガーにアクセスするすべてのコードは、静的なファクトリを介して再利用可能な ILog インタフェースをヒットし、使用されているプラ​​ットフォームの詳細を知らない。 (必要に応じて同じプラットフォーム内に異なるロガーを付けることもできます)
追加された 著者 Chris Sinclair,
(続き)もちろん、ビジネスロジックからログを取る方法を変更しなければならないことを意味します。おそらく、あなたのビジネス/ UIレイヤーが現在どのようにログに記録されているのか(そしてもしあれば)どの程度まで変更するのかのコードサンプルを投稿するべきでしょう。
追加された 著者 Chris Sinclair,

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とプラットフォーム固有のライブラリを混在させて使用しています。私の personal 設定は、リファクタリングツールを使用するのが好きなPCL向けです。#ifコードよりもPCLのほうがはるかに優れています。また、私が1から6までのプラットフォームから自分のコードを増やしたので、維持するにはあまりにも複雑な#ifステートメントの6セットが見つかりました。

上記のコードでは、Dependency InjectionとIOC技術も使用しています。私はこれがクロスプラットフォームのコード共有に本当に役立つことがわかります。 tinyioc、xplatutils、opennetcf、mvvmcrossのシンプルなIOCなど、いくつかの移植可能なIOCライブラリが利用可能です。

2
追加された

これを修正する最も簡単な方法は、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プロジェクトのすべてのファイルに「リンクイン」します。必要に応じて、特定のiOSまたはAndroidコードを持つように MONOTOUCH コンパイラフラグを設定することができます。

私たちは常にこのアプローチをとっており、柔軟性のためにPCL(移植可能なクラスライブラリ)を使用するよりも時には好んでいます。

0
追加された
プラットフォーム固有のコードがあれば、ある程度はそれをやる必要があります。 PCLを使用することは良い考えです(Stuartが示唆しているように)。しかし、各プラットフォームでインターフェイスをスタブアウトする必要があります。
追加された 著者 jonathanpeppers,
AndroidとiOS固有のコードを追加すると、いずれのプロジェクトでもこのライブラリを参照できなくなるというわけではありませんか? 2つのライブラリ(iOSとAndroid)とそれらの間の「リンクイン」ファイルを持つことは理想的ではないようです。ありがとう。
追加された 著者 Alex,