`
javababy1
  • 浏览: 1171198 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

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

阅读更多

<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

前一篇文章讲述了使用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服务了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics