2012-12-27 4 views
5

Also mein Unternehmen kommt aus einer komplett C# .Net-Umgebung, so natürlich betrachten wir Mono für die mobile Entwicklung. Wir haben eine sehr umfangreiche Windows-Plattform-Bibliothek, die ich größtenteils als Android-Klassenbibliothek portieren konnte. Die Idee ist, dass diese Android-Klassenbibliothek unsere mobile Plattform-Bibliothek sein wird, die in Zukunft für MonoTouch wiederverwendet werden kann (nicht getestet, aber gelesen, dass MonoTouch-Projekt Android-Klassenbibliotheken referenzieren kann, solange es keinen Android-spezifischen Code gibt). Innerhalb der Bibliothek gibt es jedoch viele Logging-Anweisungen, die für die Windows-Umgebung einfach Trace-Anweisungen sind (eingepackt in eine benutzerdefinierte Helper-Klasse). Wir möchten die Logging-Anweisungen beibehalten und basierend auf der aktuellen Umgebung (iOS oder Android) diese nur in die native Protokollierung übersetzen.Gemeinsam genutzte Bibliothek für MonoDroid und MonoTouch

Ich plante, partielle Deklarationen für die Protokollierung in der mobilen Plattformbibliothek zu verwenden, und die spezifischen Bibliotheken für Android und iOS enthalten die Implementierungen für diese partiellen Protokollierungsmethoden. Aber das fiel auseinander, als ich realisierte, dass Teiltöne zwischen Assemblys nicht funktionieren.

So jetzt bin ich mir nicht sicher, wie man das macht. Das einzige, was mir einfällt, wenn ich zwei separate iOS- und Android-Plattform-Bibliotheken habe und dieselben Dateien verlinke. (Xamarin könnte eine Protokollierungsklasse haben, die dies tut, aber wir müssen immer noch ein Muster für andere zukünftige Abstraktionen entwickeln)

Jeder Rat wird geschätzt. Wir befinden uns immer noch in der Experimentier-/Planungsphase, also besteht die Möglichkeit, dass wir etwas übersehen. Bitte lassen Sie uns wissen, wenn dies der Fall ist.

Danke.

Bearbeiten
Sagen wir, ich habe die folgende einfache statische Klasse.

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

Und ich habe Hunderte von Anrufen zu dieser Methode innerhalb der mobilen Plattform-Bibliothek. Sagen wir nun, dass ich diese Bibliothek in meiner Android-Anwendung referenziere, gibt es eine Möglichkeit, die Implementierung von TraceHelper.WriteLine() außer Kraft zu setzen, ohne die Bibliothek selbst zu modifizieren?

aktualisiert
Wir beenden Android und iOS Bibliotheken Erstellen up, die die fehlende .NET-Funktionalität implementiert. Umbrechen Sie die systemeigene äquivalente Funktionalität in demselben .NET-Namespace und derselben Klasse. 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

Ich bin mir nicht sicher, ob ich konkrete Ratschläge geben kann, da Sie Ihre Logging-Anweisungen nicht ändern wollen. In meiner Firma teilen wir auch Code zwischen Windows/Silverlight/Android/Unity3D, aber wir haben unsere Logging-Implementierung mit einer wiederverwendbaren Schnittstelle abstrahiert. Im Rahmen des Application-Bootstrappings fügen wir einen plattformspezifischen Logger hinter die Kulissen ein. Daher trifft unser gesamter Code, der auf den Logger zugreift, eine wiederverwendbare "ILog" -Schnittstelle über eine statische Fabrik und hat keine Kenntnis von den verwendeten Plattformspezifikationen. (hilft auch, verschiedene Logger innerhalb der gleichen Plattform wie gewünscht anzufügen) –

+1

(Forts.) Natürlich würde das wahrscheinlich bedeuten, dass Sie die Art, wie Sie von Ihrer Geschäftslogik abmelden müssen, ändern müssen. Vielleicht sollten Sie ein Codebeispiel veröffentlichen, in dem Ihr Geschäfts-/UI-Layer _currently_ protokolliert wird und in welchem ​​Umfang (sofern vorhanden) Sie dies ändern möchten. –

+0

Chris - 100% stimmen mit Ihren Kommentaren überein - Sie sollten es als Antwort schreiben. – Stuart

Antwort

2

In mvvmcross habe ich dies über Schnittstellen angegangen.

Ich habe eine gemeinsame IMvxTrace Schnittstelle deklariert, dann: ‚Ich habe eine Singleton Implementierung hinzugefügt mag:

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

Das Singleton verwendet eine darunter liegende _realTrace Implementierung.

Auf droid, die _realTrace ist:

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

Und auf Berührung, die _realTrace ist:

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

Ähnlich kundenspezifische Implementierungen auf WPF, win8 und wp dort

sind

Ich habe dies sowohl mit Dateiverknüpfung (im Master), aber in jüngerer Zeit mit einem Mischung aus PCLs und plattformspezifischen Bibliotheken. Meine persönliche Präferenz ist für PCLs wie ich Refactoring-Tools verwenden - und diese arbeiten viel besser mit PCLs als mit #if-Code. Da ich meinen Code von 1 auf 6 Plattformen erweitert habe, fand ich 6 Sätze von #if-Anweisungen zu kompliziert, um sie zu verwalten.

Beachten Sie, dass der obige Code auch Dependency Injection und eine IOC-Technik verwendet. Ich finde das sehr hilfreich für Cross-Plattform-Code-Sharing. Es sind mehrere portable IOC-Bibliotheken verfügbar, darunter tinyioc, xplatutils, opennetcf und der einfache IOC von mvvmcross.

0

Der einfachste Weg, dies zu beheben, ist ein iOS-Projekt einrichten, wo Sie im Grunde dies nur tun:

public static class TraceHelper 
{ 
    public static void WriteLine(string message) 
    { 
#if MONOTOUCH 
     Console.WriteLine(message);//or something else 
#else 
     Trace.WriteLine(message); 
#endif 
    } 
} 

Sie würden ein Monotouch Klassenbibliotheksprojekt und „Link-in“ erstellen alle Dateien von Ihrem ursprünglichen Mono für Android-Projekt. Sie könnten dann ein MONOTOUCH Compiler-Flag einrichten, um bei Bedarf spezifischen iOS- oder Android-Code zu haben.

Wir nehmen diesen Ansatz die ganze Zeit, und bevorzugen es manchmal über die Verwendung von PCLs (Portable Class Libraries) für seine Flexibilität.

+0

Wenn ich Android- und iOS-spezifischen Code hinzufüge, würde das nicht bedeuten, dass ich diese Bibliothek in keinem der beiden Projekte referenzieren kann? Zwei Bibliotheken (iOS und Android) und "Link-in" -Dateien zwischen ihnen zu haben scheint nicht ideal zu sein. Vielen Dank. – Alex

+0

Sie müssen das in gewissem Umfang tun, wenn Sie plattformspezifischen Code haben. Die Verwendung von PCLs ist eine gute Idee (wie Stuart vorschlägt), aber Sie müssen immer noch Interfaces auf jeder Plattform ausstechen. – jonathanpeppers