【发布时间】:2015-02-04 09:23:03
【问题描述】:
关于 Web API 视图模型 实体框架 数据库结构中的视图模型的集合助手类的问题。
我正在尝试在一个项目上开始设计,该项目将使用“API”前端来获取数据,然后是 HTML/Javascript 页面来获取和呈现。
在尝试为此创建 MVVM 方法时,我不确定我想要实现的方法是否良好。
这是 ViewModel 的一个 get Collection 方法。 HTML 端的用户一次只能编辑一个对象,因此该集合仅提供对象的数组/列表,从而使 Web API 类“不那么混乱”。
使用 Visual Studio MVC/Web API 项目/c#(Visual Studio 2013 so MVC 5 组件)
所以使用椅子对象的例子
注意:在实际代码中不会执行“new MyEntity().Chairs”。一直以来,它将被设置为类中的变量。简单写个例子长手就清楚了。
Web API 部分: 我们将复数 api 对象 front point Web API 控制器 = ChairsController 2个得到
namespace FurnitureAPI.Controllers
{
[Authorize]
public class ChairsController : ApiController
{
// GET api/chairs
public IHttpActionResult Get()
{
var chairs = ViewModels.Chairs.Get();
return Ok(chairs);
}
// GET api/chairs/5
//public string Get(int id)
public IHttpActionResult Get(int id)
{
var chair = ViewModels.Chairs.Get(id);
return Ok(chair);
}
public ... GET() {...} //所有椅子 public ... GET(int id) {} //单椅所在位置
在数据库方面,我们有椅子表。这对于数据库来说是单数的。 数据库已经存在,因此使用 Entity Framework 和数据库优先建模我们在 Entities 中获得
var furniture_db = new Models.FurnintureEntities();
和
Models.Chair
所以中间想要一个View Model椅子。
namespace FurnitureAPI.ViewModels {
public class Chair {
public int ChairID { get; set; }
public string Name { get; set; }
public Chair() { }
public Chair(int chairid, string name) {
ChairID = chairid;
Name = name;
}
public Chair(Models.Chair db_chair) {
ChairID = db_chair.ChairID;
Name = db_chair.Name;
}
}
在我看来,Web API ChairsController 我不希望有任何实体框架代码。 但我希望 api 调用一些东西来获取椅子视图模型的列表/集合
所以我想,在 ViewModel 命名空间中添加 Chairs 作为一个类,这将是静态的。
所以 web api 变成了
public IHttpActionResult Get()
{
var chairs = ViewModels.Chairs.Get();
return Ok(chairs);
}
然后 View Model Collection Chairs 看起来像
namespace FurnitureAPI.ViewModels {
public static class Chairs {
public static List<Chair> Get() {
List<Chair> chairs = (from s in new Models.FurnintureEntities().Chairs
select new ViewModel.Chair {
ChairID = s.ChairID,
Name = s.Name
}).ToList();
return chairs;
}
public static Chairs Get(int id) {
var chair = new FurnitureEntities().Chairs.SingleOrDefault(c => c.ChairID == id);
return chair != null ? new ViewModel.Chair(chair) : null;
}
}
所以问题是,这个椅子系列包装是否可以/理想/不好/适合山丘/其他,还是有人可以指出不同的方法?
我不明白为什么要在互联网上寻找参考资料,当然希望它不是脾气暴躁的晚年。 我首先发现了很多 WPF MVVM 实体框架数据库,但我只想制作“简单”的 Web API 来公开数据库以制作 HTML 视图。
也许我不需要关心视图模型,只需在 Web API 方法中序列化实体?
谢谢。
【问题讨论】:
-
哇...你在这里遇到了很多问题。基本上我会说您的视图模型与您的数据库层紧密耦合。你有国际奥委会的经验吗? (尝试谷歌搜索
Unity或AutoFac)。对于您的映射(select new部分,您可以使用AutoMapper之类的东西。这将集中您的映射,以便您可以重用该代码。这些技术可能会改变您的模式。 -
附带说明:在 MVVM 模式中,我倾向于仅通过 API 传递
DomainModels,并让 API 客户端从该数据创建视图模型。通过 API 传递ViewModels,它表明该调用是为某个view设计的,(在我看来)是客户端的事情。我知道这只是一个命名约定,但我更喜欢这样看:如果第 3 方使用您的 API,他们想接收视图模型还是域(数据)模型?我认为是后者,他们会构建自己的观点。 -
@Stefan 在大多数情况下,是的,视图模型将与数据库层紧密耦合。那么再看一遍,Entity Framework 能不能不看成是 View Model 呢? (在概念术语中不是名称)?和模型是实际的数据库而不是我上面列出的实体框架?那么,在某些情况下,是否可以在 Web API 中直接调用实体框架模型,而不是通过 ViewModels。在Entity Framework不足的情况下制作VM? OK(ef_model_object) 会有问题,因为 ok 无法序列化 EF,但与此无关的另一个问题
-
在某种程度上它可能是,但只是在概念上。基本上,您省略了单独的层,并在您的模式中分离了关注点。当对视图或数据库进行最轻微的更改时,直接在视图中使用 EF 总是会导致更多的工作。我经常遇到这个问题,当涉及到很多关系 ID 时,它甚至包含安全风险。起初,创建所有这些不同的视图模型似乎需要做很多工作,但当第一次更改到来时,这将是值得的。
-
主要是:API 不打算公开数据库。它是一个应用程序编程接口。这意味着它是对某些应用程序或逻辑的抽象。这种逻辑通常存在于应用程序域中,而不是数据层中。通过使用单独的视图或域模型,您可以在更改数据库甚至业务规则时保持 API 稳定:)
标签: c# asp.net-mvc entity-framework mvvm asp.net-web-api