Rest Web API oData-我应该忘记视图模型吗?
我与MVC合作已有一段时间了,我习惯于为每个MVC视图创建一个视图模型类。现在我正在尝试WebAPI,我想我可能会被这种MVC心态所困扰。我的关系是这样的:Rest Web API oData-我应该忘记视图模型吗?,rest,asp.net-mvc-4,asp.net-web-api,odata,Rest,Asp.net Mvc 4,Asp.net Web Api,Odata,我与MVC合作已有一段时间了,我习惯于为每个MVC视图创建一个视图模型类。现在我正在尝试WebAPI,我想我可能会被这种MVC心态所困扰。我的关系是这样的: public class Supplier { public int Id { get; set; } public string Title { get; set; } public virtual ICollection<SupplierProduct> SupplierProducts { get
public class Supplier
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<SupplierProduct> SupplierProducts { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<SupplierProduct> SupplierProducts { get; set; }
}
public class SupplierProduct
{
public int Id { get; set; }
public string Title { get; set; }
public int SupplierId { get; set; }
public virtual Supplier Supplier { get; set; }
public int ProductId { get; set; }
public virtual Product Product { get; set; }
}
public class SupplierCreateViewModel
{
public string Title { get; set; }
public ICollection<ProductViewModel> SelectedProducts { get; set; }
}
公共类供应商
{
公共int Id{get;set;}
公共字符串标题{get;set;}
公共虚拟ICollection供应商产品{get;set;}
}
公共类产品
{
公共int Id{get;set;}
公共字符串标题{get;set;}
公共虚拟ICollection供应商产品{get;set;}
}
公共类供应商产品
{
公共int Id{get;set;}
公共字符串标题{get;set;}
public int SupplierId{get;set;}
公共虚拟供应商{get;set;}
public int ProductId{get;set;}
公共虚拟产品产品{get;set;}
}
我正在创建供应商,在创建表单中,用户可以选择已经存在的多个产品。在MVC中,我会发布一个视图模型,该模型如下所示:
public class Supplier
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<SupplierProduct> SupplierProducts { get; set; }
}
public class Product
{
public int Id { get; set; }
public string Title { get; set; }
public virtual ICollection<SupplierProduct> SupplierProducts { get; set; }
}
public class SupplierProduct
{
public int Id { get; set; }
public string Title { get; set; }
public int SupplierId { get; set; }
public virtual Supplier Supplier { get; set; }
public int ProductId { get; set; }
public virtual Product Product { get; set; }
}
public class SupplierCreateViewModel
{
public string Title { get; set; }
public ICollection<ProductViewModel> SelectedProducts { get; set; }
}
公共类供应商CreateViewModel
{
公共字符串标题{get;set;}
公共ICollection SelectedProducts{get;set;}
}
在控制器中,我将首先创建新的供应商,然后为每个选定的产品创建新的供应商产品。我在供应商oData控制器的POST操作中在Web API中实现了类似的东西,但感觉不太对劲。我认为,相反,我需要改变我的方法,从客户那里做类似的事情:
POST-api/Suppliers/
李>
POST api/SupplierProduct
发送多个创建请求实际上,这取决于您的用例。如果您的API完全公开,我建议您使用DTO。如果是为了你自己或是为了一个内部团队,我会坚持使用OData EF模型(因为它更快)
- 您可以(像往常一样)通过api提供整个实体
- 您可以使用viewmodel(在API中使用它时更像DTO,但这是一样的),并相应地转换方法。您可以使用automapper实现这一点-它还可以转换$filter查询,这里有一个示例: