在Xamarin.Forms共享项目和Asp.Net Web API之间共享模型

时间:2017-08-08 18:18:33

标签: asp.net-mvc xamarin xamarin.android xamarin.forms asp.net-web-api2

我是Xamarin.Forms的新手,并使用Xamarin.Forms共享项目模板构建应用程序。该应用程序连接用ASP.NET编写的Web API。 Web API POST()将模型作为参数保存到数据库中。

在两者之间共享模型的最佳做法是什么,以避免在移动应用中重写模型?

1 个答案:

答案 0 :(得分:1)

我对我现有的项目做了同样的事情。我创建了一个单独的项目,我们将其称为Framework项目,仅用于在其他项目之间共享的模型。我遇到的问题是处理特定于平台的属性,SQLite注释(使用XF模型),实体框架注释(使用Web API项目),以及实体框架在基类方面是荒谬的。

我不得不摆脱我的EDMX并在我单独的Framework项目中只使用POCO模型。

两个项目都有不同的注释需要在某些属性上,我确实将Newtonsoft.Json安装到Framework项目中,因为Web API和XF项目都使用了JsonIgnoreAttribute

  • 对于ASP Web API项目,我正在使用EF,当尝试从单独项目中的Framework模型派生的模型创建表时,它做了一些奇怪的事情。因此,我能够在Framework项目中重新创建所需的属性,例如DisplayFormatAttributeDisplayNameAttribute。 (让我知道如果你有问题,我不认为我能够重建一些非常基本的,fyi)。要使用这些自定义属性,您必须从DataAnnotationsModelMetadataProvider派生,并在ModelMetadataProviders.Current上的 Global.asax 文件中设置新的派生类。

    < / LI>
  • XF项目有SQLite注释,我不想安装到Framework项目中,因此我从每个需要重写的框架模型派生,并覆盖属性以在XF项目中添加注释。

目前,sqlite-net-pcl(版本1.3.3)中有一个bug,可防止注释使用覆盖属性。回落到1.3.2,直到它被修复。

框架模型示例:

public class ExpenseModel {
    [DisplayName("Something Other Than Id")] //XF just ignores this, EF uses it
    public virtual int Id {
        get; set;
    }

    [DisplayName("Expenses")]
    public virtual List<Expense> Expenses {
        get; set;
    }
}

XF派生模型示例:

public class ExpenseModelDto : ExpenseModel {

    #region Properties

    /* 
     * Overriding the Id property from within ExpenseModel.Id in 
     * order to add [PrimaryKey] & [AutoIncrement]
     */

    [JsonIgnore]
    [PrimaryKey]
    [AutoIncrement]
    public sealed override int Id { get; set; }

    /* 
     * This is the weird crap I had to do to get collections working with the 
     * overriden DTOs instead of the ExpenseModel versions while still
     * while still appeasing SQLite.
     * 
     */

    #region Navigation Properties

    [JsonProperty("Expenses")]   //This will allow the app to serialize this model and map ExpenseModelDto.ExpenseDtos to ExpenseModel.Expenses when it gets deserialized on the server
    [Ignore]
    public List<ExpenseModelDto.ExpenseDto> ExpenseDtos {
        get; set;
    }

    [JsonIgnore]
    [Ignore]
    public override List<ExpenseModel.Expense> Expenses {
        get; set;
    }

    #endregion

    #endregion

    #region Constructors

    public ExpenseModelDto() { }

    #endregion
}