zoukankan      html  css  js  c++  java
  • 分布式开发2WCF如何正确调用LINQTO SQL

    在上一篇,我们说到了通过设置Linq上下文的Serialization Mode属性为Unidirectional,使Linq自动支持WCF的序列化。
    在这一篇我想说一下如何设置Linq实体类各种属性使WCF可以正确的调用Linq完成数据操作,并通过一些异常来说明为何要那样去做,并且在这一次,我会加入一些调料,比如工厂模式。
    好吧,让我们马上开始!项目还是使用上一篇所建立的采购项目,如果有不明白的朋友,请下载上一篇的源代码。
    说到做到,首先,
    1、我们要建立一个WCF的项目,取名为:PurchaseOrderService,这样一来,这个WCF的类库会为我们自动添加两个.cs文件,我一般将其删除。再添加一个接口
    命名为:IPurchaseOrder,


    重新引用命名空间

    using System.ServiceModel;和添加PurchaseDemo的引用;
    在IPurchaseOrder这个接口里,暂时只有一个方法:
    bool UpdatePurchaseOrder(List<PurchaseOrderHeader> purchaseOrderHeaderList);
    再为IPurchaseOrder添加一个服务实现类,为简单起见,我直接写在同一个文件中,没有任何实现,直接返回false。


    2、为了达到松耦合的目,我们加入一个工厂类,但加入之前我们需要建立数据访问层的实现类和接口,好吧,马上来做
    添加一个IDAL类库,IPurchaseOrderDAL接口,PurchaseOrderDAL类,看名字就知道,PurchaseOrderDAL类必定实现了IPurchaseOrderDAL接口
    (实际上在应用中,接口类库和实现类应该在不同的类库中)。

              

    并添加对PurchaseDemo类库的引用.OK,
    这个新建的IDAL接口也是简单到极点,只有一个方法,和WCF服务一模一样。


    3、接下来该做点什么呢?
    当然是建立数据操作工厂类,新建一个类库,取名为:DALFactory,里面有一个方法


    好的,编译整个解决方案,没有发生任何异常。
    4、上回说到,这篇里将会介绍一个数据操作通用的方法,很多朋友也很关注这个方法,为了让大家有一个直观的印象,我先贴图
    ,再慢慢细说


    为了这个方法,我们还得添加一个类库,取名为:Util,并添加一个Common<T,F>类。代码有点长,我就直接贴代码了。

    Code


    在这个类中,我们会看到,有一些以前没有看到的类型出现了,包括BaseEntity类,ReturnFlag类,PurchaseTable枚举,ExcuteStatus枚举.这四个是什么东西呢?
    在之前我们一直没有提到过为什么我们的服务类和数据操作类只会有一个方法,而正是这四个类型使得了我们的服务和数据操作类能够
    如此的干净,这个Common<T,F>有点复杂,如果有需要,这个系列完毕后回头重点介绍一下。
    1>BaseEntity类:维护了我们所要进行更新的数据的状态(update,delete,new)
    2>ReturnFlag类:维护了数据操作后要返回的状态,主要是为了支持WF(workflow),后面我们的这个项目还会加入工作流,所以
    提前做点准备。
    3>PurchaseTable枚举,定义了一组Linq上下文中的实体名映射
    这些都是必不可少的。好了,下面继续

    5、接着把上面提到的四种类型添加到PurchaseDemo命名空间中。
    为了使用这四个新建的类型支持WCF,我们还需要做什么?当然是加上序列化标记
    直接贴代码。


    Code

    然后,还记得上回我们建立的部分类吗?好的,让它们继承自BaseEntity类,这样它们就有了数据操作的状态

    到现在为止,我们没有做对WCF的调用。接下来介绍调用的顺序:图片比较粗糙,

    按照上面的流程,我们来调用一下。
    首先是WCF通过工厂调用数据操作类,

    Code

    PurchaseOrderDAL调用Common<T,F>的GenericUpdate()方法的设置。

    Code

    6、接下来建立一个控制台应用程序作为WCF的服务主机,配置好并运行,有关配置方法,参见"张逸"兄弟的博客,

    7、到现在为止,我们的程序已初具“分布式应用程序”的雏形了,好好看一下吧

    8、好像一切都很顺利,有点不可思议,好吧,实践才是硬道理。先弄个客户端来调用一下服务。


    9、不好意思,抛出一个异常

    因为我们没有设置:行的上次修改时间,而这个列又没有设置为数据库自动生成列,自然会有异常了,而且这个列也应该是在服务器生成的。

    Code

    这次就先写到这里吧,感觉有点长了,真怕变成又长又臭了。
    不足:
    这次只涉及到了添加,如果是修改或删除将会有更多的异常,欢迎转载,但请注明出处--lostcode博客(http://www.cnblogs.com/viter/)!
    下一篇将介绍修改和删除数据。谢谢大家的关注!

    点击下面下载服务端和客户端源代码.

    https://files.cnblogs.com/viter/WCF.rar

    说得不对的地方,欢迎拍砖!


     

    • 欢迎关注收取阅读最新文章
    • 好看点个推荐呗~
    • 出处:http://www.cnblogs.com/viter/
    • 本文版权归作者和博客园共有,欢迎个人转载,必须保留此段声明;商业转载请联系授权,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
    • 欢迎大家关注我的微信公众号,一起学习一起进步
  • 相关阅读:
    零基础入门:实时音视频技术基础知识全面盘点
    IM开发干货分享:如何优雅的实现大量离线消息的可靠投递
    flask_apscheduler 定时任务框架
    小程序使用 editor 富文本编辑器填坑指南
    万年深坑:mpVue 中的坑
    js利用canvas绘制爱心
    【字节跳动21届提前批】面试手撕代码——电梯调度算法
    Maximum call stack size exceeded 报错
    未安装less-loder
    05 vue前端工程化
  • 原文地址:https://www.cnblogs.com/viter/p/1259479.html
Copyright © 2011-2022 走看看