Rest Web API oData-我应该忘记视图模型吗?

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

我与MVC合作已有一段时间了,我习惯于为每个MVC视图创建一个视图模型类。现在我正在尝试WebAPI,我想我可能会被这种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; }
}
公共类供应商
{
公共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/
  • 在响应中使用供应商JSON的Id,向
    POST api/SupplierProduct
    发送多个创建请求
  • 因此,我的问题是:

  • 我采用这种方法的方向正确吗
  • 我应该使用不同的模式来代替视图模型吗?DTO
  • 在给出的示例中,我是否被迫发送1-n个这样的请求?这感觉不对

  • 实际上,这取决于您的用例。如果您的API完全公开,我建议您使用DTO。如果是为了你自己或是为了一个内部团队,我会坚持使用OData EF模型(因为它更快)

    • 您可以(像往常一样)通过api提供整个实体

    • 您可以使用viewmodel(在API中使用它时更像DTO,但这是一样的),并相应地转换方法。您可以使用automapper实现这一点-它还可以转换$filter查询,这里有一个示例:

    别忘了,API有很多很棒的优点。OData使用批处理和修补程序更改实体。所以我个人大部分时间都坚持使用Odata作为实体,但这是我个人的选择