Общая библиотека для MonoDroid и MonoTouch

Таким образом, моя компания происходит из полностью окружающая среда C#.Net, так естественно мы смотрим на Моно для мобильного развития. У нас есть очень обширная библиотека платформы окон, которая я смог держать большую часть в строевой стойке из него как Библиотека классов Android. Идея, являющаяся, что эта Библиотека классов Android будет нашей библиотекой мобильной платформы, которая может быть снова использована в будущем для MonoTouch (Не проверили, но прочитали, что проект MonoTouch может сослаться на Библиотеки классов Android пока, нет никакого Android определенный код). В библиотеке, хотя, есть много регистрирующихся заявлений, которые для окружающей среды окон только заканчивают тем, что были заявлениями следа (обернутый в таможенный класс помощника). Мы хотим сохранить регистрирующиеся заявления и на основе текущей окружающей среды (iOS или Android), просто перевести тех на родную регистрацию.

Я планировал использовать частичные объявления для входа в систему библиотеки мобильной платформы и иметь Android и iOS, определенные библиотеки содержат внедрения для тех частичных методов регистрации. Но это развалилось, когда я понял, что partials не работают между собраниями.

Таким образом, теперь я не уверен, как пойти об этом. Единственная вещь я могу думать, имея две отдельных 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
добавлено отредактировано
Просмотры: 1
de
Крис - 100% соглашаются с вашими комментариями - необходимо написать его как ответ.
добавлено автор Stuart, источник
Не уверенный, если я могу дать конкретный совет начиная с вас don' t хотят изменить ваши заявления регистрации. В моей компании, we' разделение ре кодирует между Windows/Silverlight/Android/Unity3D также, но we' ve резюмировал наше внедрение регистрации с интерфейсом многократного использования. Как часть прикладной самонастройки, мы прилагаем определенного для платформы лесоруба негласно. Таким образом весь наш код, который получает доступ к лесорубу, поражает многократного использования ILog интерфейс через статическую фабрику, и не знайте об используемых специфических особенностях платформы. (также помогает приложить различных лесорубов в той же самой платформе, как желаемый),
добавлено автор Chris Sinclair, источник
(продолжение следует). Конечно, это, вероятно, означало бы you' d должны изменить способ, которым вы регистрируетесь от своей бизнес-логики. Возможно, необходимо отправить пример кода того, как business/UI слой в настоящее время регистрируется и до какой степени (если таковые имеются) you' ре, готовое изменить это.
добавлено автор Chris Sinclair, источник

2 ответы

В mvvmcross я занялся этим использованием интерфейсы.

Я объявил общий интерфейс IMvxTrace, тогда я 've добавил внедрение единичного предмета его как:

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

Этот единичный предмет использует основное _realTrace внедрение.

На Droid _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

Я сделал это оба файла использования, связывающиеся (во владельце), но позже использующие смесь PCLs и платформы определенные библиотеки. Мой личных предпочтение для PCLs, поскольку мне нравится использовать инструменты рефакторинга - и они работают намного лучше с PCLs, чем с кодом #if. Кроме того, поскольку я вырастил свой код с 1 до 6 платформ, которые я счел 6 наборов #if заявлений слишком сложными, чтобы поддержать.

Обратите внимание, что код выше также использует Внедрение зависимости и метод МОК. Я считаю это действительно полезным для кросс-платформенного кодового разделения. Есть несколько портативных библиотек МОК, доступных включая tinyioc, xplatutils, opennetcf, и простой МОК mvvmcross.

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 и "ссылку - во" всех файлах из вашего оригинала, Моно для проекта Android. Вы могли тогда установка MONOTOUCH флаг компилятора, чтобы иметь определенную iOS или код Android в случае необходимости.

Мы проявляем этот подход все время и предпочитаем его иногда по использованию PCLs (портативные библиотеки классов), поскольку это - гибкость.

0
добавлено
Вы оказываетесь перед необходимостью делать это в некоторой степени, если у вас есть какая-либо платформа определенный код. Используя PCLs хорошая идея (как Стюарт, предлагает), но необходимо будет все еще погасить интерфейсы на каждой платформе.
добавлено автор jonathanpeppers, источник
Если я добавляю Android и iOS определенный код, wouldn' t, которые означают что я привычка быть в состоянии сослаться на эту библиотеку в любом проекте? Имея две библиотеки (iOS и Android) и "связь - в" файлах между ними кажется меньше, чем идеал. Спасибо.
добавлено автор Alex, источник