一步一步学Linq to sql(十):分层构架的例子

2023-05-16

项目介绍

 

       这节将要把《一步一步学Linq to sql(三):增删改》中留言簿的例子修改为使用WCF的多层构架。我们将会建立以下项目:

l         A,网站项目 WebSite:留言簿表现层

l         B,类库项目 Contract:定义数据访问服务的契约

l         C,类库项目 Service:定义数据访问服务

l         D,类库项目Entity:留言簿实体

l         E,控制台项目Host:承载数据访问服务

项目之间的引用如下:

l         A引用BD

l         B引用DSystem.ServiceModel程序集

l         C引用BDSystem.ServiceModel以及System.Data.Linq程序集

l         D引用System.Data.Linq程序集

l         E引用CSystem.ServiceModel程序集

 

生成映射文件和实体

 

       打开VS2008命令行提示,执行以下命令:

sqlmetal /conn:server=xxx;database=GuestBook;uid=xxx;pwd=xxx /map:c:\guestbook.map /code:c:\guestbook.cs /serialization:Unidirectional

       注意到,这里我们使用了serialization开关,告知sqlmetal在生成实体的时候自动把它们标记为WCF数据对象。生成结束后把C:\GUESTBOOK.CS添加到Entity项目中。

 

编写数据访问服务

 

       首先我们可以定义出留言簿数据访问服务的契约(接口),把如下的代码保存为IDataAccess.cs放在Contract类库项目中:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

 

namespace Contract

{

    [ServiceContract]

    public interface IDataAccess

    {

        [OperationContract]

        void SendMessage(TbGuestBook gb);

 

        [OperationContract]

        List<TbGuestBook> GetData();

 

        [OperationContract]

        void DeleteMessage(string ID);

 

        [OperationContract]

        void SendReply(TbGuestBook gb);

    }

}

       在这里定义了四个方法:

l         创建留言

l         获取所有留言

l         删除留言

l         管理员发表回复

然后,我们来实现这个契约,把如下代码保存为DataAccess.cs放在Service类库项目中:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using Contract;

using System.Data.Linq.Mapping;

using System.IO;

using System.ServiceModel;

 

namespace Service

{

    [ServiceBehavior(IncludeExceptionDetailInFaults = true)]

    public class DataAccess : IDataAccess

    {

        GuestBook ctx;

 

        public DataAccess()

        {

            XmlMappingSource xms = XmlMappingSource.FromXml(File.ReadAllText("c:\\guestbook.map"));

            ctx = new GuestBook("server=srv-devdbhost;database=GuestBook;uid=sa;pwd=Abcd1234", xms);

            ctx.Log = Console.Out;

        }

 

        public void SendMessage(TbGuestBook gb)

        {

            ctx.TbGuestBook.Add(gb);

            ctx.SubmitChanges();

        }

 

        public List<TbGuestBook> GetData()

        {

            var query = from gb in ctx.TbGuestBook orderby gb.PostTime descending select gb;

            return query.ToList();

           

        }

 

        public void DeleteMessage(string ID)

        {

            TbGuestBook gb = ctx.TbGuestBook.Single(message => message.ID == new Guid(ID));

            ctx.TbGuestBook.Remove(gb);

            ctx.SubmitChanges();

        }

 

        public void SendReply(TbGuestBook gb)

        {

           //ctx.ExecuteCommand("update tbGuestBook set reply={0},isreplied=1 where ID={1}", gb.Reply, gb.ID);

            TbGuestBook record = ctx.TbGuestBook.Single(message => message.ID == gb.ID);

            record.IsReplied = true;

            record.Reply = gb.Reply;

            ctx.SubmitChanges();

        }

    }

}

       这里需要注意几点:

l         我们把DataContext的操作在控制台输出

l         在进行发表回复(更新操作)的时候,注释的代码和没有注释的代码虽然都能完成更新操作,但是前者更合理,因为后者会先进行SELECT再进行UPDATE

 

WCF服务端与客户端

 

       打开Host项目中的Program.cs,使用下面的代码来实现WCF的服务端:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.ServiceModel;

using Service;

using Contract;

 

namespace Host

{

    class Program

    {

        static void Main(string[] args)

        {

           

            Uri uri = new Uri("net.tcp://localhost:8080/DataAccessService");

            using (ServiceHost sh = new ServiceHost(typeof(DataAccess), uri))

            {

                NetTcpBinding ctb = new NetTcpBinding();

                sh.AddServiceEndpoint(typeof(IDataAccess), ctb, string.Empty);

                sh.Opened += delegate { Console.WriteLine("服务已经启动"); };

                sh.Open();

                Console.ReadLine();

            }

        }

    }

}

       WebSite项目中的App_Code文件夹下创建一个用户调用服务的类,GetService.cs

using System;

using System.Data;

using System.Configuration;

using System.Linq;

using System.Web;

using System.Web.Security;

using System.Web.UI;

using System.Web.UI.WebControls;

using System.Web.UI.WebControls.WebParts;

using System.Web.UI.HtmlControls;

using System.Xml.Linq;

using Contract;

using System.ServiceModel.Description;

using System.ServiceModel;

 

public class GetService

{

    public static IDataAccess GetDataAccessService()

    {

        ServiceEndpoint sep = new ServiceEndpoint(ContractDescription.GetContract(typeof(IDataAccess)),

            new NetTcpBinding(),

            new EndpointAddress("net.tcp://localhost:8080/DataAccessService"));

 

        ChannelFactory<IDataAccess> cf = new ChannelFactory<IDataAccess>(sep);

 

        return cf.CreateChannel();

    }

}

 

调用服务

 

       最后,就可以调用数据访问服务来进行留言、回复、删除留言等操作了。页面的代码不再贴了,大家可以看第三篇或者下载源代码。我们把Default.cs修改成如下:

public partial class _Default : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

        {

            SetBind();

        }

    }

    protected void btn_SendMessage_Click(object sender, EventArgs e)

    {

        TbGuestBook gb = new TbGuestBook();

        gb.ID = Guid.NewGuid();

        gb.IsReplied = false;

        gb.PostTime = DateTime.Now;

        gb.UserName = tb_UserName.Text;

        gb.Message = tb_Message.Text;

        GetService.GetDataAccessService().SendMessage(gb);

        SetBind();

    }

    private void SetBind()

    {

        rpt_Message.DataSource = GetService.GetDataAccessService().GetData();

        rpt_Message.DataBind();

    }

}

       Admin.cs代码修改成如下:

public partial class Admin : System.Web.UI.Page

{

    protected void Page_Load(object sender, EventArgs e)

    {

        if (!IsPostBack)

        {

            SetBind();

        }

    }

 

    private void SetBind()

    {

        rpt_Message.DataSource = GetService.GetDataAccessService().GetData();

        rpt_Message.DataBind();

    }

    protected void rpt_Message_ItemCommand(object source, RepeaterCommandEventArgs e)

    {

        if (e.CommandName == "DeleteMessage")

        {

            GetService.GetDataAccessService().DeleteMessage(e.CommandArgument.ToString());

            SetBind();

        }

        if (e.CommandName == "SendReply")

        {

            TbGuestBook gb = new TbGuestBook();

            gb.ID = new Guid(e.CommandArgument.ToString());

            gb.Reply = ((TextBox)e.Item.FindControl("tb_Reply")).Text;

            GetService.GetDataAccessService().SendReply(gb);

            SetBind();

        }

    }

}

       就这样实现了一个多层构架的留言簿程序。对于WCF的一些内容本文不多作解释了。点击这里下载本篇代码。
        
        如果您觉得这个例子太简单,还可以在这里下载一个Linq/WCF/MVC结合使用更复杂的例子,此例的目的主要演示一个框架,实现不完整。  

       一步一步学Linq to sql到这里就结束了,看到这里应该已经算师父领进门了,后续的提高还要靠大家自己去琢磨。

 

 

TrackBack:http://www.cnblogs.com/lovecherry/archive/2007/09/02/878907.html

转载于:https://www.cnblogs.com/hdjjun/archive/2008/06/17/1223694.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

一步一步学Linq to sql(十):分层构架的例子 的相关文章

随机推荐

  • goldengate 认证矩阵matrix

    http www oracle com technetwork middleware ias downloads fusion certification 100350 html 64 more 64 来自 ITPUB博客 xff0c 链接
  • 关于maven打包 “程序包com.sun.deploy.net不存在” 的问题

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 关于maven打包 程序包com sun deploy net不存在 的问题 遇到问题如下 xff1a INFO payGateway 1 0 SNAPSHOT SUCCE
  • 印度理工学院有多难考?

    http app myzaker com news article php pk 61 599546401bc8e08604000085 印度理工学院有多难考 xff1f 何赟08 17 原文是六月高考季时给公众号 34 中印对话 34 x
  • iOS系统下 的手机屏幕尺寸 分辨率 及系统版本 总结

    今天 我对iOS系统下 的手机屏幕尺寸 分辨率 及系统版本做了一次系统总结 供大家参考 首先 是系统 xff1a 随着iOS 系统不断升级 xff0c 现在已经到iOS7 0了 xff0c 并且TA有了很多新变化 xff0c 最震撼的就是
  • android ViewFlipper的使用

    屏幕切换指的是在同一个Activity内屏幕见的切换 xff0c 最长见的情况就是在一个FrameLayout内有多个页面 xff0c 比如一个系统设置页面 xff1b 一个个性化设置页面 通过查看 OPhone API文档可以发现 xff
  • linux tail命令的使用方法详解

    本文介绍Linux下tail命令的使用方法 linux tail命令用途是依照要求将指定的文件的最后部分输出到标准设备 xff0c 通常是终端 xff0c 通俗讲来 xff0c 就是把某个档案文件的最后几行显示到终端上 xff0c 假设该档
  • C/C++中static的用法全局变量与局部变量

    1 什么是static static 是C C 43 43 中很常用的修饰符 xff0c 它被用来控制变量的存储方式和可见性 1 1static的引入 我们知道在函数内部定义的变量 xff0c 当程序执行到它的定义处时 xff0c 编译器为
  • ubuntu apt-get和aptitude 安装软件包

    一 apt get apt get是一条linux命令 xff0c 适用于deb包管理式的操作系统 xff0c 主要用于自动从互联网的软件仓库中搜索 安装 升级 卸载软件或操作系统 什么是apt get编辑 是debian xff0c ub
  • 关于Egret Engine 2.5.3引入GUI模块问题记录

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 基本环境 xff1a Egret Engine 2 5 3 Egret Wing 2 1 使用EgretWing创建Game项目 xff0c 然后需要引入GUI模块 具体引
  • linux brctl command not found

    root 64 localhost brctl bash brctl command not found 解决方法 xff1a root 64 localhost yum install bridge utils
  • 参数LOG_ARCHIVE_MIN_SUCCEED_DEST

    LOG ARCHIVE MIN SUCCEED DEST PropertyDescriptionParameter type IntegerDefault value 1Modifiable ALTER SESSION ALTER SYST
  • Boot loader: Grub入门(转)

    Boot Loader Grub 在看完了前面的整个启动流程 xff0c 以及核心模块的整理之后 xff0c 你应该会发现到一件事情 xff0c 那就是 boot loader 是加载核心的重要工具 啊 xff01 没有 boot load
  • 容器概念与Linux Container原理

    一 容器与LxC 在像KVM等众多主机虚拟化解决方案中 xff0c 对每一个虚拟机实例提供的是从底层硬件开始一直到上层的环境 xff0c 在硬件级进行资源划分 虚拟机的内核是运行在硬件内核之上的 由于每个虚拟实例都有自己的运行内核 xff0
  • springboot security

    Authority 权限 Credential 证书 Grant 授予 Authentication 身份验证 以下 xff0c 我们将通过四步 xff0c 逐步实现spring security的username 43 password身
  • MPEG-4视频编码核心思想

    1 引言 当今时代 xff0c 信息技术和计算机互联网飞速发展 xff0c 在此背景下 xff0c 多媒体信息已成为人类获取信息的最主要载体 xff0c 同时也成为电子信息领域技术开发和研究的热点 多媒体信息经数字化处理后具有易于加密 抗干
  • xss payload

    gt lt SCRIPT gt alert 34 hello 34 lt SCRIPT gt 转载于 https www cnblogs com fanzi2009 archive 2009 08 13 1545474 html
  • NSIS学习笔记(转)

    转自 xff1a http blog csdn net lee353086 article details 45919901 NSIS学习笔记 Date 2015 05 20 Author kagula Env VS2013Update4
  • 英文破折号(em dash)、连接号(en dash)与连字符(hyphen)的区别及各自用法是什么?...

    英文破折号 xff08 em dash xff09 连接号 xff08 en dash xff09 与连字符 xff08 hyphen xff09 的区别及各自用法是什么 xff1f 在科技写作中有何特点 xff1f 2 条评论 分享 按票
  • vmware中按Ctrl+Alt+Del的困扰

    虚拟机技术越来越多的在日常工作中得以应用 xff0c 尤其是在软件开发行业 xff0c 虚拟机用得就更为广泛了 xff0c 而开发人员一般使用得虚拟机是vmware系列 xff0c 但是在使用过程中 xff0c 我们经常会被一个问题困扰 x
  • 一步一步学Linq to sql(十):分层构架的例子

    项目介绍 这节将要把 一步一步学 Linq to sql xff08 三 xff09 xff1a 增删改 中留言簿的例子修改为使用 WCF 的多层构架 我们将会建立以下项目 xff1a l A xff0c 网站项目 WebSite xff1