WCF+EF 实战系列三 WCF服务的实现与托管

前一篇文章讲述了使用EF来构选我们的模型实体,及业务层的实现。见http://blog.csdn.net/greystar/archive/2008/11/26/3377943.aspx

本文主要讲述的是WCF的实现,WCF的理论可真不少,服务契约,操作契约,及相关的行为处理是一大堆。去年买的WCF服务编程可只动了几页就看不下去了。说实话,真是很浪费,还不如在网上看看那些专家级的博客来得实在。WCF的一些理论可以见如下引用:

http://www.cnblogs.com/artech/archive/2007/02/26/656901.html

http://www.cnblogs.com/jillzhang/category/121346.html

都是一个系列的,说的比较透彻,很适合初学者,理论加实际代码的DEMO

 

下面我们来新建一个WCF服务库Demo.WCFContract,这个是定义服务的契约的。MS的模板会帮我们自动生成相应的契约定义和实现。这里我们是分开来的。因此删除相应的文件,新建一个类IEmployeeService.cs

using System;

using System.Collections.Generic;

using System.Linq;

using System.Runtime.Serialization;

using System.ServiceModel;

using System.Text;

using Demo.EDM;

namespace Demo.WCFContract

{

    [ServiceContract()]

    public interface IEmployeeService

    {

        [OperationContract]

        Employee Add(Employee emp);

        [OperationContract]

        void Delete(Employee emp);

        [OperationContract]

        void Update(Employee emp);

        [OperationContract]

        List<Employee> GetEmployees() ;

    }

}

 

IEmployeeService接口提供了增删改查的基本服务。可能你会觉得怪怪的为什么是

  Employee Add(Employee emp);

这样来定义。这是因为emp对象是客户端传上来的。在服务器端做完保存操作后,emp对象的状态等信息会改变,如果不将此对象传回客户端,则当客户端对此记录再次修改或删除时就会出现问题,无法附加。因此上篇文章定义的Employeemanager类里的新增方法也要做修改了。

EmployeeManager.cs

  public Employee Add(Employee emp)

        {

            context.AddToEmployees(emp);

            context.SaveChanges();

            return emp;

        }

 

再创建一个WCF服务库,Demo.WCFService .此类库将对上面的服务契约进行真正的实现。从而为客户提供EMPLOYEE的业务处理。但是内部的业务处理是由EmployeeManager实现的,应该我们将添加Demo. Demo.BusinessManagers的引用。其实现相对比较简单:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

using Demo.EDM;

using System.Reflection;

using Demo.BusinessManagers;

using System.Linq.Expressions;

using System.Data.Objects.DataClasses;

namespace Demo.WCFService

{

    public class EmployeeService : Demo.WCFContract.IEmployeeService

    {

         public EmployeeService()

        {

        }

        #region IEmployeeService 成员

        public Employee Add(Employee emp)

        {

            using (EmployeeManager manager = new EmployeeManager())

            {

                return manager.Add(emp);

            }

        }

        public void Delete(Employee emp)

        {

            using (EmployeeManager manager = new EmployeeManager())

            {

                manager.Delete(emp);

            }

        }

 

        public void Update(Employee emp)

        {

            using (EmployeeManager manager = new EmployeeManager())

            {

                manager.Update(emp);

            }

        }

 

        List<Employee> Demo.WCFContract.IEmployeeService.GetEmployees()

        {

            using (EmployeeManager manager = new EmployeeManager())

            {

                return manager.GetEntities();

            }

        }

 

        #endregion

    }

}

 

下面就要创建托管程序了.建一个Windows程序,Demo.WCFHost.引用相关的项目,

新增一个app.config.这里我们需要做二件事,一个是数据访问连接的设置,还有一个就是WCF服务的配置。

先来看一下数据访问连接字符串的设置。由于使用了EF,因此写法上要使用EF的标准。当然你如果没有删除Demo.EDM下的app.config,你可以把里面的连接字符串复制过来。

<?xml version="1.0" encoding="utf-8"?>

<configuration>

  <connectionStrings>

    <add name="newwideEntities" connectionString="metadata=res://*/MyEDM.csdl|res://*/MyEDM.ssdl|res://*/MyEDM.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=newwide;Persist Security Info=True;User ID=sa;Password=123;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

  </connectionStrings>

</configuration>

 

当然你需要做一下修改,因为其资源文件是以资源方式存在的,所以需要把*改成你的类库名。

<connectionStrings>

    <add name="newwideEntities" connectionString="metadata=res://Demo.EDM/MyEDM.csdl|res://Demo.EDM/MyEDM.ssdl|res://Demo.EDM/MyEDM.msl;provider=System.Data.SqlClient;provider connection string=&quot;Data Source=.;Initial Catalog=newwide;Persist Security Info=True;User ID=sa;Password=123;MultipleActiveResultSets=True&quot;" providerName="System.Data.EntityClient" />

  </connectionStrings>

 

 

这样就将数据连接配置好了。下面我们接着配置一下WCF的配置,如果你可以直接在web.config里自己写,也可以使用wcf的配置工具来生成相应的配置。

关于WCF的配置文件http://www.cnblogs.com/chnking/archive/2008/01/23/1049353.html 这里介绍的比较详细的。

那么作为新手,我们就使用相应的配置工具来实现吧。在app.config上右键会看到有个编辑WCF配置的选项,点击就打开了WCF的配置工具。

在右边的服务里点新建服务:

 

选择你要托管的服务的实现。

 

 

 

 

 

点击下一步完成。

 

点击左侧主机,在右边点新建(基址)

 

 

由于我们的服务是需要对外发布的,因此还需要对服务行为进行配置,以便客户能访问到该服务的元数据。

 

添加完后在双击该要配置的堆栈元素。设置httgeturlhttpgetenabled

 

此时我们的服务元数据在http://localhost:20001/EmployeeService地址处进行了发布。

再回到服务下的Demo.WCFService.EmployeeService,选中。配置该服务的行为。

 

WCF的配置到此就结束了。保存一下。

 

下面就是要写代码,发布我们的服务了。

  public partial class Form1 : Form

    {

        public Form1()

        {

            InitializeComponent();

        }

        ServiceHost host = null;

        private void Form1_Load(object sender, EventArgs e)

        {

            host = new ServiceHost(typeof(Demo.WCFService.EmployeeService));

            host.Opened+= delegate{Console.WriteLine("start");};

            host.Open();

        }

}

 

运行该项目Demo.WCFHost

打开IE.输入服务元数据发布地址:http://localhost:20001/EmployeeService

 

如果能正常看到。就表示你成功了。可以为其他人提供EMPLOYEE服务了。

 

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值