wcf step by step:改进HelloWorld程序
这个示例让我们来解决这两个问题,首先把数据契约和服务契约与服务的实现分离到不同的dll中,把数据和服务契约分离到不同的dll中是因为我们的数据实体类需要在各个层次中充当数据交换的载体。而服务契约仅在客户端与服务端交互时才用到,所以把它们分离出来,从组件间的依赖关系中我们也可以看到数据契约组件被很多组件引用,而服务契约则在很多地方不需要。
我们的solution看起来比较复杂了,实际的企业开发中不会比这个简单,我们的demo尽量真实。解决客户端布署的问题就是让Shore.cnlbos.com.WCFClient只引用Shore.cnblogs.com.WCFData,Shore.cnblogs.com.WCFInterface而不再依赖于Shore.cnblogs.com.WCFService了。客户端不再通过svcutil工具生成代理类了,现在我们需要手工来实现一个代理类。先看代码吧
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;
using System.ServiceModel.Channels;
using System.ServiceModel.Description;
using Shore.cnblogs.com.WCFInterface;
using Shore.cnblogs.com.WCFData;
namespace Shore.cnblogs.com.WCFClient
{
public class EmployeeServiceProxy : ClientBase<IEmployeeService>,IEmployeeService
{
public EmployeeServiceProxy() : base()
{
}
public EmployeeServiceProxy(string endpointConfigName)
: base(endpointConfigName)
{
}
public EmployeeServiceProxy(Binding binding, EndpointAddress address)
: base(binding, address)
{
}
#region IEmployeeService Members
public void AddEmployee(Employee em)
{
Channel.AddEmployee(em);
}
public string GetEmpNameByID(int id)
{
return Channel.GetEmpNameByID(id);
}
#endregion
}
}
很简单,只需要实现从ClientBase<T>的类继承下来,然后实现服务契约的接口就行,它的实现只是简单的调用Channel.XXX就是,所以我们把它叫proxy。
下载Demo