strategy standard specific net code app and c# xamarin.ios shared-libraries xamarin.android xamarin

c# - standard - xamarin forms platform specific code



Biblioteca compartida para MonoDroid y MonoTouch (2)

En mvvmcross, he abordado esto usando interfaces.

He declarado una interfaz común de IMvxTrace, luego he agregado una implementación única de esta como:

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

Este singleton usa una implementación _realTrace subyacente.

En droide, _realTrace es:

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

Y en contacto, _realTrace es:

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

Del mismo modo, hay implementaciones personalizadas en wpf, win8 y wp

Lo he hecho tanto usando el enlace de archivos (en el maestro), pero más recientemente usando una combinación de PCL y bibliotecas específicas de la plataforma. Mi preferencia personal es para las PCL porque me gusta usar herramientas de refactorización, y estas funcionan mucho mejor con las PCL que con el código #if. Además, como he desarrollado mi código de 1 a 6 plataformas, encontré 6 conjuntos de declaraciones #if demasiado complicadas de mantener.

Tenga en cuenta que el código anterior también usa Inyección de Dependencia y una técnica de IOC. Encuentro esto realmente útil para el intercambio de código multiplataforma. Hay varias bibliotecas IOC portátiles disponibles que incluyen tinyioc, xplatutils, opennetcf y el simple COI de mvvmcross.

Así que mi empresa proviene de un entorno completamente C # .Net, por lo que naturalmente estamos buscando Mono para el desarrollo móvil. Tenemos una biblioteca de plataformas de Windows muy extensa que pude exportar en su mayoría como una biblioteca de clases de Android. La idea es que esta biblioteca de clases de Android será nuestra biblioteca de plataforma móvil que se puede reutilizar en el futuro para MonoTouch (no lo he probado, pero leí que el proyecto MonoTouch puede hacer referencia a bibliotecas de clase de Android siempre que no haya un código específico de Android). Sin embargo, dentro de la biblioteca, hay muchas instrucciones de registro, que para el entorno de Windows simplemente terminan siendo declaraciones de rastreo (envueltas en una clase de ayuda personalizada). Queremos conservar las declaraciones de registro y, en función del entorno actual (iOS o Android), simplemente tradúzcalas en el registro nativo.

Estaba planeando usar declaraciones parciales para el registro en la biblioteca de la plataforma móvil y las bibliotecas específicas de Android e iOS contienen las implementaciones para esos métodos de registro parcial. Pero eso se vino abajo cuando me di cuenta de que los parciales no funcionan entre ensamblajes.

Así que ahora no estoy seguro de cómo hacerlo. Lo único que se me ocurre es tener dos bibliotecas de plataforma iOS y Android separadas y vincular los mismos archivos. (Xamarin podría tener una clase de registro que hace esto, pero aún necesitamos crear un patrón para cualquier otra abstracción futura)

Cualquier consejo es apreciado. Todavía estamos en la fase experimental / de planificación, por lo que existe la posibilidad de que pasemos por alto algo, háganos saber si ese es el caso.

Gracias.

Editar
Digamos que tengo la siguiente clase estática simple.

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

Y tengo cientos de llamadas a este método dentro de la biblioteca de la plataforma móvil. Ahora digamos que hago referencia a esta biblioteca en mi aplicación Android, ¿hay alguna manera de anular la implementación de TraceHelper.WriteLine () sin modificar la biblioteca en sí?

Actualizar
Terminamos creando bibliotecas de Android e iOS que implementaron la funcionalidad .NET faltante. Simplemente ajuste la funcionalidad equivalente nativa, en el mismo espacio de nombres .NET y clase. 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); } } }


La manera más fácil de arreglar esto es configurar un proyecto iOS donde básicamente puedes hacer esto:

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

Debería crear un proyecto de biblioteca de clase MonoTouch y "enlazar" todos los archivos de su proyecto Mono original para Android. A continuación, puede configurar un MONOTOUCH compilador MONOTOUCH para que tenga un código específico de iOS o Android si es necesario.

Tomamos este enfoque todo el tiempo, y lo preferimos a veces sobre el uso de PCL (bibliotecas de clases portátiles) por su flexibilidad.