1

我正在构建一个项目,该项目同时拥有AndroidiOS客户MonoTouchMonoDroid。公共业务层项目包含公共领域实体。

其中一个需要存储图像、名称和年龄。图像未下载。

是否可以创建一个通用对象来保存 PNG 或 JPG 的实际数据,但它在某种程度上都适用于iOSAndroid

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

2 回答 2

4

选项:

  1. 将图像表示为 byte[] 或 MemoryStream/Stream
  2. 使用本机平台特定代码需要部分类并链接 Customer.cs 中的公共类 - 通过项目链接我将此方法称为 split-n-link 或 link-n-split

    公共部分类客户{公共字符串名称;公共国际年龄;}

单点触控项目中单点触控的增量类

public partial class Customer {
    public UIImage;
}

m4a 项目中用于 android 的单声道的 delta 类

public partial class Customer {
    public ImageView;
}

因此,每个项目将包含 Customer.cs 一个原始/源代码和其他链接,如果处理 Windows Phone,则取决于偏好或共同特征分母(目前它具有最小的功能集 - 更好的是限制性更强) . 除了 main/original/source Customer.cs 文件之外,还有 2 个(如果是 WP,则为 3 个)具有平台特定内容的增量。请记住,部分类是“附加的”,这意味着您可以在不同的 cs 文件中添加属性并应用它们,因此在这个 delta 类中,可以添加特定于平台的属性,并在需要时启用诸如绑定 iOS 广告/或 Android 之类的东西。从 Holisticware 经验(Visual Studio 为中心 80%+,Mac 上 20% 或更少)源项目是 Mono for Android,但它可能是反向的......

使用 link-n-spilt 基本上以 POCO + delta 结尾,并且此 POCO 可用于定位桌面平台(WF、WPF),其中一切都更容易:调试、单元测试等。

并且每个项目都使用该平台的配置进行编译/构建的优势 - 所以来自 Xamarin 的 ig 家伙想出了一些其他的好主意来构建大小优化,这不应该影响项目 - 重新编译并开始!

HTH 梅尔

于 2012-05-23T05:50:23.770 回答
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 注入单独的本机实现。

在 UI 项目中,当您实际上需要在 UI 上显示图像时,我通常会将 IImage 转换为本机实现,例如 TouchImage - 然后它将包含一个获取底层 UIImage 的方法


例如,不是您的图像要求,但这是我为相机捕获操作的图像所做的:https ://github.com/slodge/MvvmCross/tree/vnext/Cirrious/Plugins/PictureChooser

于 2012-05-23T06:54:08.743 回答