点击下载Demo源码
先看一下项目整体分层架构
- Entity实体层。这里使用Linq To Sql来实现。数据库比较简单只放了一张TB_GuestBook表
需要注意的是为了支持WCF,要右击空白处设置序列化模式为单向。
表中添加了一个timestamp时间戳类型,在直接使用Linq自动生成sql功能进行update操作时,需要有一个时间戳字段,或是在linq设计页面选择表的一个字段设置为时间戳。才能正常update到数据库中。如果是调用自定义的存储过程就可以省略这步。
2.契约层,即服务向客户端提供的接口。
namespace Contract
{
[ServiceContract]
public interface IGuestBook
{
/// <summary>
/// 新增信息
/// </summary>
/// <param name="tb">信息体</param>
/// <returns>执行结果</returns>
[OperationContract]
bool Add(TB_GuestBook tb);
/// <summary>
/// 删除信息
/// </summary>
/// <param name="tb"></param>
/// <returns></returns>
[OperationContract]
bool Delete(int id);
/// <summary>
/// 修改信息
/// </summary>
/// <param name="tb"></param>
/// <returns></returns>
[OperationContract]
bool Update(TB_GuestBook tb);
/// <summary>
/// 获取列表
/// </summary>
/// <returns></returns>
[OperationContract]
List<TB_GuestBook> GetList();
}
}
3. WCF服务实现层。主要实现对应接口的方法。
namespace WcfService
{
// 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码、svc 和配置文件中的类名“GuestBook”。
[ServiceBehavior(IncludeExceptionDetailInFaults = true)]
public class GuestBook : IGuestBook
{
GuestBookDataContext dc;
public GuestBook()
{
dc = new GuestBookDataContext();
}
public bool Add(TB_GuestBook tb)
{
try
{
dc.TB_GuestBook.InsertOnSubmit(tb);
dc.SubmitChanges();
}
catch (Exception)
{
return false;
throw;
}
return true;
}
public bool Delete(int id)
{
try
{
TB_GuestBook tb = dc.TB_GuestBook.SingleOrDefault(e => e.ID == id);
dc.TB_GuestBook.DeleteOnSubmit(tb);
dc.SubmitChanges();
}
catch (Exception)
{
return false;
throw;
}
return true;
}
public bool Update(TB_GuestBook tb)
{
try
{
dc.TB_GuestBook.Attach(tb, true);
dc.SubmitChanges();
}
catch (Exception)
{
return false;
throw;
}
return true;
}
public List<TB_GuestBook> GetList()
{
try
{
return dc.TB_GuestBook.ToList();
}
catch (Exception)
{
return null;
throw;
}
}
}
}
4.部署服务到IIS。服务实现层编译完成后,在IIS中添加虚拟目录(或网站),目录位置为服务层所在文件夹。
在IIS中右击GuestBook.svc->浏览.可看到页面显示说明可以客户端正常调用服务了。
5.Winform客户端
右击Service References,添加服务引用
引用地址为IIS中浏览的页面地址
在此处可以看到WCF提供的几个方法。重命名空间名GuestBookService,确定后可看到服务已经添加到客户端。
控件数据绑定:
添加一个DataGridView,DataSource的属性点击下拉按钮,在“其他数据源”下可以找到服务提供的数据源TB_GuestBook,选中它。
选完后系统会生成一个tbGuestBookBindingSource的数据源。将几个文本框的Text属性都绑定到该数据源下的对应字段上。
比如ID文本框的设置如下:
控件都绑定完成后,就可以写功能代码了。
1.加载数据:先声明一个服务代理变量GuestBookClient dc ;
加载数据方法调用WCF服务代理的getList方法,直接赋值给BindingSource
private void LoadData()
{
tbGuestBookBindingSource.DataSource = dc.GetList();
}
private void Form1_Load(object sender, EventArgs e)
{
LoadData();
}
删除按钮:
private void btnDel_Click(object sender, EventArgs e)
{
TB_GuestBook tb = tbGuestBookBindingSource.Current as TB_GuestBook;
if (tb != null)
{
if (dc.Delete(tb.ID))
{
LoadData();
MessageBox.Show("删除成功.");
}
else
MessageBox.Show("删除失败.");
}
else
{
MessageBox.Show("选择的对象为空");
}
}
保存按钮:
private void btnSave_Click(object sender, EventArgs e)
{
TB_GuestBook tb = tbGuestBookBindingSource.Current as TB_GuestBook;
if (dc.Update(tb))
{
LoadData();
MessageBox.Show("更新成功.");
}
else
MessageBox.Show("更新失败.");
}