前一篇文章讲述了使用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="Data Source=.;Initial Catalog=newwide;Persist Security Info=True;User ID=sa;Password=123;MultipleActiveResultSets=True"" 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="Data Source=.;Initial Catalog=newwide;Persist Security Info=True;User ID=sa;Password=123;MultipleActiveResultSets=True"" 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的配置工具。
在右边的服务里点新建服务:
选择你要托管的服务的实现。
点击下一步完成。
点击左侧主机,在右边点新建(基址)
由于我们的服务是需要对外发布的,因此还需要对服务行为进行配置,以便客户能访问到该服务的元数据。
添加完后在双击该要配置的堆栈元素。设置httgeturl及httpgetenabled
此时我们的服务元数据在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服务了。