2012-12-27 5 views
5

Donc, ma société vient d'un environnement complètement C# .Net, donc naturellement nous regardons Mono pour le développement mobile. Nous avons une bibliothèque de plate-forme Windows très étendue, que j'ai pu porter en grande partie sous la forme d'une bibliothèque de classes Android. L'idée étant que cette bibliothèque de classes Android sera notre bibliothèque de plates-formes mobiles qui pourra être réutilisée à l'avenir pour MonoTouch (N'avez pas testé, mais lisez ce projet MonoTouch peut référencer les bibliothèques de classes Android tant qu'il n'y a pas de code spécifique Android). Cependant, dans la bibliothèque, il y a beaucoup d'instructions de journalisation, qui pour l'environnement Windows finissent par être des instructions de suivi (enveloppées dans une classe d'assistance personnalisée). Nous souhaitons conserver les instructions de journalisation et, en fonction de l'environnement actuel (iOS ou Android), les convertir en journalisation native. Je prévoyais d'utiliser des déclarations partielles pour la journalisation dans la bibliothèque de la plateforme mobile et de faire en sorte que les bibliothèques spécifiques à Android et à iOS contiennent les implémentations pour ces méthodes de journalisation partielle. Mais cela s'est effondré quand j'ai réalisé que les partiels ne fonctionnaient pas entre les assemblées.Bibliothèque partagée pour MonoDroid et MonoTouch

Alors maintenant, je ne suis pas sûr de savoir comment s'y prendre. La seule chose à laquelle je peux penser est d'avoir deux bibliothèques de plate-forme iOS et Android séparées et de relier les mêmes fichiers. (Xamarin peut avoir une classe de journalisation qui fait cela mais nous devons toujours trouver un modèle pour toutes les autres abstractions futures)

Tout conseil est apprécié. Nous sommes encore dans la phase d'expérimentation/planification donc il y a une chance que nous puissions négliger quelque chose, s'il vous plaît laissez-nous savoir si c'est le cas.

Merci.

Édition
Disons que j'ai la classe statique simple suivante.

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

Et j'ai des centaines d'appels à cette méthode dans la bibliothèque de plate-forme mobile. Maintenant disons que je référence cette bibliothèque dans mon application Android, est-il possible de surcharger l'implémentation de TraceHelper.WriteLine() sans modifier la bibliothèque elle-même?

Mise à jour
Nous avons fini par créer des bibliothèques Android et iOS qui a implémenté la fonctionnalité .NET manquantes. Juste enveloppez la fonctionnalité équivalente native, dans le même espace de noms et classe .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); 
     } 
    } 
} 
+5

Je ne sais pas si je peux donner des conseils concrets puisque vous ne voulez pas modifier vos relevés de connexion. Dans mon entreprise, nous partageons du code entre Windows/Silverlight/Android/Unity3D, mais nous avons extrait notre implémentation de journalisation avec une interface réutilisable. Dans le cadre de l'amorçage de l'application, nous attachons un enregistreur spécifique à la plate-forme dans les coulisses. Ainsi, tout notre code qui accède à l'enregistreur frappe une interface 'ILog' réutilisable via une usine statique et n'a aucune connaissance des spécificités de la plate-forme utilisées. (aide également à attacher différents enregistreurs au sein de la même plateforme que vous le souhaitez) –

+1

(suite) Bien sûr, cela signifierait probablement que vous deviez changer la façon dont vous vous connectez à partir de votre logique métier. Vous devriez peut-être publier un exemple de code sur la façon dont votre entreprise/votre couche d'interface utilisateur _currently_ se connecte et dans quelle mesure (le cas échéant) vous êtes prêt à changer cela. –

+0

Chris - 100% d'accord avec vos commentaires - vous devriez l'écrire comme une réponse. – Stuart

Répondre

2

Dans mvvmcross, j'ai abordé cela en utilisant des interfaces.

J'ai déclaré une interface IMvxTrace commune, alors j'ai ajouté une implémentation singleton de celui-ci comme:

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

Ce singleton utilise une implémentation _realTrace sous-jacente.

Sur droïde, le _realTrace est:

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

Et toucher, le _realTrace est:

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

De même, il existe des implémentations personnalisées sur WPF, Win8 et wp

Je l'ai fait à la fois en utilisant la liaison de fichiers (en master), mais plus récemment en utilisant un mélange de PCL et de bibliothèques spécifiques à la plate-forme. Mon personnel préférence est pour PCL comme j'aime utiliser des outils de refactoring - et ceux-ci fonctionnent beaucoup mieux avec les PCL qu'aveC#if code. De plus, comme j'ai développé mon code de 1 à 6 plateformes, j'ai trouvé 6 ensembles d'instructions #if trop compliquées à maintenir. Notez que le code ci-dessus utilise également l'injection de dépendances et une technique IOC. Je trouve cela très utile pour le partage de code multi-plateforme. Il existe plusieurs bibliothèques IOC portables, y compris tinyioc, xplatutils, opennetcf et le simple IOC de mvvmcross.

0

La meilleure façon de résoudre ce problème est d'installer un projet iOS où vous pouvez simplement le faire:

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

Vous créer un projet de bibliothèque de classes MonoTouch et « lien dans » tous les fichiers de votre projet Mono original pour Android. Vous pouvez ensuite configurer un indicateur de compilateur MONOTOUCH pour avoir un code iOS ou Android spécifique si nécessaire.

Nous prenons cette approche tout le temps, et nous préférons parfois sur l'utilisation de PCL (bibliothèques de classes portables) pour sa flexibilité.

+0

Si j'ajoute du code spécifique à Android et iOS, cela ne signifie-t-il pas que je ne serai pas capable de référencer cette bibliothèque dans l'un ou l'autre projet? Avoir deux bibliothèques (iOS et Android) et des fichiers «link-in» entre eux semble moins qu'idéaux. Merci. – Alex

+0

Vous devrez faire cela dans une certaine mesure si vous avez un code spécifique à la plate-forme. L'utilisation de PCL est une bonne idée (comme le suggère Stuart), mais vous devrez quand même remplacer les interfaces sur chaque plate-forme. – jonathanpeppers

Questions connexes