我是Xamarin.Forms的新手,并使用Xamarin.Forms共享项目模板构建应用程序。该应用程序连接用ASP.NET编写的Web API。 Web API POST()
将模型作为参数保存到数据库中。
在两者之间共享模型的最佳做法是什么,以避免在移动应用中重写模型?
答案 0 :(得分:1)
我对我现有的项目做了同样的事情。我创建了一个单独的项目,我们将其称为Framework项目,仅用于在其他项目之间共享的模型。我遇到的问题是处理特定于平台的属性,SQLite注释(使用XF模型),实体框架注释(使用Web API项目),以及实体框架在基类方面是荒谬的。
我不得不摆脱我的EDMX并在我单独的Framework项目中只使用POCO模型。
两个项目都有不同的注释需要在某些属性上,我确实将Newtonsoft.Json安装到Framework项目中,因为Web API和XF项目都使用了JsonIgnoreAttribute
:
对于ASP Web API项目,我正在使用EF,当尝试从单独项目中的Framework模型派生的模型创建表时,它做了一些奇怪的事情。因此,我能够在Framework项目中重新创建所需的属性,例如DisplayFormatAttribute
和DisplayNameAttribute
。 (让我知道如果你有问题,我不认为我能够重建一些非常基本的,fyi)。要使用这些自定义属性,您必须从DataAnnotationsModelMetadataProvider
派生,并在ModelMetadataProviders.Current
上的 Global.asax 文件中设置新的派生类。
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
}