2017-03-22 52 views
0

我想了解如何使用MVVM模式进行CRUD操作。目前我在我的API控制器中有如下方法。我的问题是:使用MVVM模式,我还应该如何构建我的api(例如访问数据库)?还是应该改变?如果没有任何变化,在这种情况下,我会实现ViewModels以及它们应该如何由API管理?我做了一些研究,但对我来说还不清楚。使用MVVM模式的Asp .NET Web API

public IHttpActionResult GetProduct(int id) 
{ 
    var product = _context.Products.SingleOrDefault(p => p.Id == id); 
    return Ok(product); 
} 

[HttpPost] 
public IHttpActionResult CreateProduct(Product product) 
{ 
    ... 
    _context.Products.Add(product); 
    _context.SaveChanges(); 

    return Created(new Uri(Request.RequestUri + "/" + product.Id), product); 
} 

回答

2

我认为问题的一部分是,你不明白MVVM在Web应用程序中的作用。要理解,您必须将Web应用程序视为由两个独立的应用程序组成 - 服务器端和客户端。

服务器端,使用的模式是MVC(毫不奇怪,它被称为ASP.NET MVC的原因)。如果你试图让你对MVVM模式有所了解 - 不要。它不适用。服务器上的MVC模式很容易理解和实现;不要试图撬动任何MVVM。只需使用服务器端模式设计您的服务器端代码即可。

客户端是另一回事。默认情况下,使用Razor页面的ASP.NET MVC将在服务器上呈现您的HTML并将其传递给客户端。而且,通常情况下,HTML旨在通过回发到服务器来响应用户与页面的交互。您的控制器方法解释这些回发,执行所需的逻辑,并呈现正确的剃刀页面作为响应。但这不是编写网站的唯一方法。

越来越多的人在设计单页面应用程序。这些使用ajax回调将用户操作的结果发送回服务器,然后处理响应。在服务器端,这些请求几乎总是通过WebApi控制器方法处理,而不是ASP.NET MVC控制器方法。该请求以ajax的形式出现,并且结果通常以ajax的形式返回。没有HTML被渲染。这就是MVVM发挥作用的地方。

客户端方面,这些网页通常使用JavaScript MVVM(ish)框架,如knockoutjsangular。响应json用于更新绑定到网页中HTML元素的视图模型。这些框架处理UI和这些视图模型之间的同步更新和用户操作,就像Bindings在UI和WPF中的视图模型之间同步更新一样。

简而言之,MVC是它自己的事情,MVVM通常只存在于网站的客户端,通常只有当网站广泛使用ajax回调而不是回发。

而且,要回答您的直接问题,如果您在客户端使用MVVM,使用ajax调用来执行您的CRUD操作,您应该设计WebApi控制器方法来发布/获取/放入/删除数据。

+0

谢谢。所以我认为这只是对概念的误解。在代码方面,我认为**一旦我有我的API发布/获取/放置/删除,我的视图正在向我的API请求ajax方法,我已经做了正确的想法。我一直在用web api构建我的服务器端,在我看来,我通常使用jQuery插件来请求ajax的API方法。我现在开始看Angular(婴儿步骤),并且我遇到了MVVM概念,并且我感到困惑。感谢您的澄清(请根据需要对我刚才所说的内容进行更正),欢呼声。 – jtron

1

就个人而言,我总是使用Repository模式来处理与CRUD操作有关的任何事情,例如与数据库中的实体进行交互。

我将创建一个名为“ProductRepository”的单独类,并将所有方法放在该类的Get,Create,Update和Delete Product中。这样,只有您的Respository关心与数据库交互的细节并对其执行CRUD操作。你的整个应用程序不应该关心如何完成,只需要你的Repository类。这就是所谓的单一责任原则。它是设计和架构的“固体”原则的一部分。

然后,在您的Controller或ViewModel中或您需要它发生的任何地方,您只需实例化ProductRepository并在整个应用程序中使用它的方法。

如果您为服务层和数据访问层使用单独的Web API,那么您并不需要MVC。您只需要一个前端框架来使用Web API URL,比如AngularJS或您选择的任何其他JS框架。

如果你想使用MVC,那么你并不需要Web API。您可以将您的服务层和数据访问层构建到MVC应用程序中,或者将它们构建为单独的项目(类库),并将它们包含在整个项目解决方案中。这一切都取决于你希望如何构建架构以及你想要如何复杂。

但无论哪种方式,都应该涉及“ProductRepository” - 无论是在您的Web API中(如果您走这条路线),还是在您的MVC项目中(如果您走这条路线)。最终目标是分离关注点。您想要将业务逻辑层与数据访问层分开。您不希望在整个应用程序中直接调用数据库。这将导致代码紧密耦合,很难随时测试和维护。如果您将来更换数据库,则只需更新代码中的一个位置,而不是更新许多位置。

希望这可以帮助你一些!最好的问候和快乐的编码!

+0

谢谢关于存储库的说明,Chase。很有用。 – jtron