2012-05-23 2 views
1

Я строю проект, который имеет Android и iOS клиентов с MonoTouch и MonoDroid. Общий проект бизнес-уровня содержит общие объекты домена.MonoTouch + MonoDroid: Общие бизнес-объекты с изображениями

У одного из них есть необходимость хранить изображение, имя и возраст. Изображение не загружается.

Возможно ли создать общий объект, который содержит фактические данные для PNG или JPG, но который как-то работает как в iOS, так и в Android?

///Simplified customer 
class Customer { 
    public Image???; 
    public string Name; 
    public Int Age; 
} 
+0

Mm. Представить изображение как массив байтов? – Sver

ответ

4

Варианты:

  1. представляют изображение в виде байт [] или MemoryStream/Стрим
  2. остаться с родной платформы конкретного кода требует частичных классов и связывая общий класс в Customer.cs - связаны между собой через проекты Я называю этот подход split-n-link или link-n-split

    public partial class Customer { pu blic string Имя; public Int Age; }

дельта-класс для MonoTouch в MonoTouch проекта

public partial class Customer { 
    public UIImage; 
} 

дельта-класс для моно для Android в m4a проекта

public partial class Customer { 
    public ImageView; 
} 

Таким образом, каждый проект будет содержать Customer.cs один оригинал/source и другую ссылку на него, которая зависит от предпочтений или общего знака-знаменателя при работе с Windows Phone (в настоящее время он имеет наименьший набор функций - лучше это m рудный ограничительный). Помимо основного/оригинального/исходного файла Customer.cs, есть 2 (3, если WP) дельта с платформой конкретных вещей. Помните, что частичные классы являются «аддитивными», что означает, что вы можете добавлять атрибуты в другой файл cs, и они применяются, поэтому в этом классе дельта можно добавлять атрибуты, специфичные для платформы, и включать такие вещи, как привязка для iOS ad/or Android, если это необходимо. Из опыта Holisticware (Visual Studio ориентирован на 80% +, 20% или меньше на Mac) исходный проект Mono для Android, но он может быть обратным ...

С link-n-spilled один заканчивается в основном POCO + delta, и этот POCO может использоваться для таргетинга на настольную платформу (WF, WPF), где все проще: отладка, модульное тестирование и т. д.

И есть преимущество, что каждый проект скомпилирован/построен с конфигурацией для этой платформы. ig ребята из Xamarin придумали какую-то другую яркую идею для построения, как оптимизация размеров, это не должно влиять на проекты - перекомпилируйте и идите!

НТН Мэл

1

я сделать этот тип обмена с использованием интерфейсов или абстрактных базовых классов с реализаций конкретных инжектированных во время выполнения.

Например, я мог бы поставить на место некоторые интерфейсы, такие как:

public interface IImage 
{ 
     int Height { get; } 
     int Width { get; } 
} 

public interface IImageTools 
{ 
     IImage Load(string assetPath); 
     void SaveToJPEG(IImage image, string savePath, int quality); 
     IImage DuplicateAndResize(IImage original, int newHeight, int newWidth); 
} 

Мой бизнес-модель будет тогда иметь какой-то способ, чтобы получить ссылку на IImageTools - например, он может быть добавлен в конструктор или может быть доступен из некоторого контейнера (например, одиночного тора IoC)

Это позволяет мне вводить отдельные встроенные реализации во время выполнения для Droid, Touch, WP7, WinRT или NUnit.

В проектах пользовательского интерфейса, когда вам действительно нужно отобразить изображение в пользовательском интерфейсе, я, как правило, передавал IImage в собственную реализацию, например. TouchImage - который затем будет содержать метод для удержания лежащего в основе UIImage


, например. Не совсем ваше требование к изображению, но вот что я делаю для изображений для операций Camera Capture: https://github.com/slodge/MvvmCross/tree/vnext/Cirrious/Plugins/PictureChooser