65.9K
CodeProject 正在变化。 阅读更多。
Home

使用 Entity Framework 和 MVC 4 开发 WCF 4.5 服务

starIconstarIconstarIconstarIconstarIcon

5.00/5 (9投票s)

2013 年 4 月 22 日

CPOL

7分钟阅读

viewsIcon

86576

使用 Entity Framework 和 MVC 4 前端开发 WCF 4.5 服务

引言

在本文中,我将介绍如何实现 Windows Communication Foundation (WCF) 与 Entity Framework (EF) 和 MVC 4 的集成。在先决条件方面,我假设您对基本 Web 服务和 Web 应用程序概念有所了解。但是,我不期望您在使用 WCF 或 .NET 4.5 方面有任何实际经验。本文将介绍使用 WCF 4.5 构建简单应用程序的一些基本知识,并使用 Entity Framework 在前端通过 MVC 4 展示数据。此应用程序将使用可在互联网上广泛获得的 Northwind 示例数据库。开发环境为 Visual Studio 2012。此应用程序的最终结果将在 ASP.NET MVC 中显示数据。服务将被公开并返回十种最昂贵产品的列表。

背景 

请注意,这只是一个演示,是真实应用程序的简化版本。在实际应用程序中,您可能需要分层组织您的应用程序。例如,按关注点分离:业务数据访问、业务逻辑、业务数据对象(实体)和表示层。

代码使用

让我们开始创建 WCF 服务。下面是创建 WCF 服务的步骤:

  1. 打开 Visual Studio 2012,并以管理员身份运行(右键单击 VS2012,然后选择“以管理员身份运行”)。这将允许您运行在本地托管的服务。
  2. 使用 VS2012,选择“文件”|“新建”|“项目…”打开“新建项目”对话框。
  3. 在“新建项目”窗口的左侧面板中,选择“Visual C#”|“WCF”|“WCF 服务库”作为项目模板。
  4. 然后输入项目名称、位置和解决方案名称。在本例中,项目名称为 WcfEfMvcService,位置为 C:\Projects\VS2012_Projects\,解决方案命名为 WcfEfMvcDemo。
  5. 单击“确定”;Visual Studio 将创建包含三个文件的项目:IService1.csService1.cs 和 App.config。

EF 和 Northwind 数据库建模

EF 和 Northwind 数据库建模 Entity Framework (EF) 旨在将查询映射和结果塑造的过程与对象构建分离。它允许您创建关于数据的概念模型,构建对象并对其进行编程。请按照以下步骤操作。

  1. 右键单击 WcfEfMvcService 项目,选择“添加”|“新建项”,然后选择“Visual C# 项”|“ADO.NET 实体数据模型”作为模板。
  2. 将名称输入为 NorthwindModel.edmx。
  3. 选择“从数据库生成”,选择现有的或创建新的 Northwind 连接,然后单击“下一步”。
  4. 在填写完连接值后再次选择“下一步”。
  5. 展开“表”对象并选择“Product”表,然后单击“完成”。

创建服务接口和操作约定

上面步骤中创建的 IService1.cs 包含默认的服务约定。请注意,该接口使用了 System.Runtime.Serialization,因此我们现在拥有一个可以在服务操作中使用的类型。

在我们开始处理接口及其实现之前,让我们创建一个类来保存从数据库返回的数据。我们将这个类命名为 ProductEntity.cs。它包含我们为此目的所需的三个成员。我们添加了 set 和 get 属性,以防将来需要对这个类进行读写访问。ProductEntity 类应如下所示:

现在,让我们来处理接口及其实现。首先,将 IService.cs 重命名为 IProductService.cs,并将 Service.cs 重命名为 ProductService。现在,您的解决方案应如下所示:

以下是创建接口和服务实现的步骤。

  1. 打开 IPoductService.cs,删除现有的操作约定,并将其替换为 List<productentity> GetTenMostExpensiveProducts();。此服务约定描述了客户端可以在服务上执行的操作。您的接口类应如下所示:
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    
    namespace WcfEfMvcService
    {
    ////Describes which operations the client can perform on the service
    [ServiceContract]
    public interface IProductService
    {
        [OperationContract]
        List<productentity> GetTenMostExpensiveProducts();
    }  
    }
  2. 现在,我们将处理实现。打开 ProductService.cs。我们只需要创建一个 LINQ to Entities 语句,其余的都由 LINQ to Entities 处理。代码简洁且强类型。LINQ to Entities 会转换底层 SQL 语句并将其传递给数据库。它对于更细粒度的控制非常灵活。以下代码将返回十种最昂贵的产品。您的 ProductService 类应如下所示:
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Runtime.Serialization;
    using System.ServiceModel;
    using System.Text;
    namespace WcfEfMvcService
    {
    public class ProductService : IProductService
    {
    public List<productentity> GetTenMostExpensiveProducts()
    {
        using (NorthwindEntities db = new NorthwindEntities())
        {
            var query = (from pro in db.Products
                         select new ProductEntity()
                         {
                             ProductName = pro.ProductName,
                             QuantityPerUnit = pro.QuantityPerUnit,
                             UnitPrice = pro.UnitPrice.Value
                         }).OrderByDescending(x => x.UnitPrice).Distinct().Take(10); ;
    
            return query.ToList();
        }
    }
    }
    }

现在,您的服务已准备好运行。但是,在运行服务之前,让我们查看 App.config,它定义了地址、约定和绑定。确保所有 Service1 实例都已替换为 ProductService。您的 App.config 应如下所示:

如果按 F5 运行服务或单击 Visual Studio 工具栏上的“运行”按钮,您应该会看到应用程序成功运行,如下图所示。您将在列表中看到一个方法 GetTenMostExpensiveProducts()。调用此方法时,您将在底部面板中看到响应。您还可以通过单击底部的 XML 选项卡来查看 SOAP 请求和响应。

编写客户端并使用 WCF 服务

在此演示中,我们将使用 ASP.NET MVC 来使用该服务。您还可以通过其他方法使用该服务,例如 Windows 窗体、WPF、Windows 服务,甚至是其他技术,如 Java 等。

要使用 MVC 创建前端客户端,请执行以下操作:

  1. 右键单击 WcfEfMvcDemo 解决方案,然后选择“添加”|“新建项目…”
  2. 在“添加新项目”窗口中,在左侧面板中选择“Web”,然后选择“ASP.NET MVC 4 Web Application”。
  3. 将项目命名为 WcfEfMvcClient,然后单击“确定”。
  4. 选择“Internet 应用程序”作为项目模板,然后单击“确定”。
  5. 现在,MVC 4 项目已添加到解决方案中,您应该会看到选择“Internet 应用程序”作为模板项目时创建的几个默认文件夹。
  6. 让我们添加对 WcfEfMvcService 类的引用,因为我们需要使用 ProductEntity 类。
  7. 右键单击 WcfEfMvcClient 项目下的“引用”,然后选择“添加 Web 服务引用…”
  8. 当“添加服务引用”窗口出现时,单击“发现”按钮或在文本框中键入服务地址。您可以根据需要命名服务引用,或者将其保留为默认值(ServiceReference1)。
  9. 在此步骤中,您可以创建自己的控制器,但在此演示中,让我们使用 HomeController。打开 HomeController.cs 并添加 using 语句(using WcfEfMvcService;)。
  10. 为了使用该服务,我们需要实例化服务引用,如下所示:ServiceReference1.ProductServiceClient obj = new ServiceReference1.ProductServiceClient();
  11. 创建一个名为 Product 的方法,该方法返回一个 ActionResult。您的 Home Controller 应如下所示:
    using System;
            using System.Collections.Generic;
            using System.Linq;
            using System.Web;
            using System.Web.Mvc;
            using WcfEfMvcService;
            namespace WcfEfMvcClient.Controllers
            {
            public class HomeController : Controller
            {
            ServiceReference1.ProductServiceClient obj = new ServiceReference1.ProductServiceClient();
            public ActionResult Product()
            {
            List<productentity> productOrders = new List<productentity>();
        productOrders = obj.GetTenMostExpensiveProducts().ToList();
        return View(productOrders);
    }
    
    public ActionResult Index()
    {
        ViewBag.Message = "Modify this template to jump-start your ASP.NET MVC application.";
    
        return View();
    }
    
    public ActionResult About()
    {
        ViewBag.Message = "Your app description page.";
    
        return View();
    }
    
    public ActionResult Contact()
    {
        ViewBag.Message = "Your contact page.";
    
        return View();
    }
  12. 在此步骤中,我们将创建一个视图。右键单击“Home”视图,然后选择“添加”|“视图…”
  13. 在“添加视图”窗口中,将名称输入为 Product,选中“创建强类型视图”并使用 ProductEntity (WcfEfMvcService) 作为模型类。
  14. 打开 Product.cshtml 并将第一行更改为 @model IEnumerable<wcfefmvcservice.productentity>。这将允许您遍历 Produce Entity 的 IEnumerable 集合。
  15. 使用 foreach 循环遍历上面定义的 Model。您的 Product.cshtml 中的代码应如下所示:
  16. 将 WcfEfMvcClient 项目设置为启动项目,然后运行应用程序。最终结果应如下面的截图所示:

摘要

至此,本文就结束了。我们已经看到 WCF、EF 和 MVC 协同工作得很好。WCF 适用于面向公共 Web 的服务场景,您需要高度的可伸缩性和互操作性。好消息是 WCF 提供了一个编程模型,可以适应这些不同的样式和各种不同的消息格式。EF 使开发人员能够拥有我们通常需要编写的大部分数据访问代码。而 MVC 是一个非常健壮且近年来日益流行的模式。所以,只有一种编写代码的方式,但有很多种组织代码的方式。

使用 Entity Framework 和 MVC 4 开发 WCF 4.5 服务 - CodeProject - 代码之家
© . All rights reserved.