一步一步学Linq to sql(十):多层架构MVC WCF Linq

简介: 前言 本次主要是使用WCF的多层架构。我们将建立以下项目:  A,MVC网站项目 MvcOperation:留言簿表现层 B,类库项目 Contract:定义数据访问服务的契约 C,类库项目 Service:定义数据访问服务 D,类库项目Entity:留言簿实体 E,控制台项目Host:承载数据访问服务 项目之间的引用如下: A引用B和D; B引用D和System.

前言

本次主要是使用WCF的多层架构。我们将建立以下项目:

 A,MVC网站项目 MvcOperation:留言簿表现层
 B,类库项目 Contract:定义数据访问服务的契约
 C,类库项目 Service:定义数据访问服务
 D,类库项目Entity:留言簿实体
 E,控制台项目Host:承载数据访问服务

项目之间的引用如下:
 A引用B和D;
 B引用D和System.ServiceModel程序集
 C引用B、D、System.ServiceModel以及System.Data.Linq程序集
 D引用System.Data.Linq程序集
 E引用C和System.ServiceModel程序集
生成映射文件和实体
打开VS2010命令行提示,执行以下命令:

sqlmetal /conn:server=.;database=GuestBook;uid=sa;pwd=saa /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
    {
        /// <summary>
        /// 添加  or 修改
        /// </summary>
        /// <param name="gb"></param>
        [OperationContract]
        void SendMessage(TbGuestBook gb);

        /// <summary>
        /// 获取所有信息
        /// </summary>
        /// <returns></returns>
        [OperationContract]
        List<TbGuestBook> GetData();

        /// <summary>
        /// 删除
        /// </summary>
        /// <param name="ID"></param>
        [OperationContract]
        void DeleteMessage(string ID);


        /// <summary>
        /// 获取一条记录
        /// </summary>
        /// <param name="ID"></param>
        /// <returns></returns>
        [OperationContract]
        TbGuestBook GetDataID(string ID);

    }
}

然后,我们来实现这个契约,把如下代码保存为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=.;database=GuestBook;uid=sa;pwd=saa", xms);
            ctx.Log = Console.Out;
        }


        public void SendMessage(TbGuestBook gb)
        {
            TbGuestBook tb =null;
            tb = GetDataID(gb.ID.ToString());
            if (tb != null)
            {
                tb.Message = gb.Message;
                tb.Reply = gb.Reply;
                tb.PostTime = gb.PostTime;
                tb.UserName = gb.UserName;
                ctx.SubmitChanges();
            }
            else
            {
                ctx.TbGuestBook.InsertOnSubmit(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.DeleteOnSubmit(gb);
            ctx.SubmitChanges();
        }

        public TbGuestBook GetDataID(string ID)
        {
            TbGuestBook record = ctx.TbGuestBook.SingleOrDefault(message => message.ID.ToString() ==ID);
            return record;
        }
    }
}

WCF服务端与客户端

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

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Service;
using System.ServiceModel;
using Contract;

namespace Host
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri uri = new Uri("net.tcp://localhost:880/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();
            }

        }
    }
}

在MvcOption项目中添加一个Helper文件夹下创建一个用户调用服务的类,ServerHelper.cs:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.ServiceModel.Description;
using System.ServiceModel;
using Contract;

namespace MvcOperation.Helper
{
    public class ServerHelper
    {
        public static IDataAccess GetDataAccessService()
        {

            ServiceEndpoint sep = new ServiceEndpoint(ContractDescription.GetContract(typeof(IDataAccess)),
                new NetTcpBinding(),
                new EndpointAddress("net.tcp://localhost:880/DataAccessService"));
            ChannelFactory<IDataAccess> cf = new ChannelFactory<IDataAccess>(sep);
            return cf.CreateChannel();
        }

    }
}

最后对控制器中的代码进行修正如下:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using System.Configuration;
using System.IO;
using MvcOperation.Helper;

namespace MvcOperation.Controllers
{
    public class HomeController : Controller
    {
        public ActionResult Index()
        {
            ViewBag.Message = "欢迎使用 ASP.NET MVC!";
            //List<tbGuestBook> list = (from gb in ctx.tbGuestBook
            //                         orderby gb.PostTime descending 
            //                         select gb).ToList();

            return View("Index", ServerHelper.GetDataAccessService().GetData());
        }

        public ActionResult About()
        {
            return View();
        }

        public ActionResult AddBook()
        {
            return View();
        }

        public ActionResult DelBook(string id)
        {
            //tbGuestBook gb = ctx.tbGuestBook.Single(b => b.ID == new Guid(id));
            //ctx.tbGuestBook.DeleteOnSubmit(gb);
            //ctx.SubmitChanges();
            ServerHelper.GetDataAccessService().DeleteMessage(id);
            return Index();
        }

        public ActionResult UpdateBook(string id)
        {
            TbGuestBook gb = ServerHelper.GetDataAccessService().GetDataID(id);
            return View("AddBook",gb);

        }

        public ActionResult SaveBook(TbGuestBook tb)
        {
            TbGuestBook gb = null;
            if (tb.ID.ToString() != "00000000-0000-0000-0000-000000000000")
            {
                gb = ServerHelper.GetDataAccessService().GetDataID(tb.ID.ToString());
                gb.PostTime = DateTime.Now;
                gb.UserName = tb.UserName;
                gb.Message = tb.Message;
                ServerHelper.GetDataAccessService().SendMessage(gb);
                return Index();
            }
            else
            {
                tb.ID = Guid.NewGuid();
                tb.IsReplied = false;
                tb.PostTime = DateTime.Now;
                ServerHelper.GetDataAccessService().SendMessage(tb);
            }
                return Index();
        }
    }
}

示例代码下载地址http://files.cnblogs.com/aehyok/MVCLinqWCF.rar






  

目录
相关文章
|
1月前
|
设计模式 存储 前端开发
MVVM、MVC、MVP三种常见软件架构设计模式的区别
MVC、MVP 和 MVVM 是三种常见的软件架构设计模式,主要通过分离关注点的方式来组织代码结构,优化开发效率。
60 12
|
2月前
|
安全 数据管理 中间件
云LIS系统源码JavaScript+B/S架构MVC+SQLSugar医院版检验科云LIS系统源码 可提供演示
检验科云LIS系统源码是医疗机构信息化发展的重要趋势。通过云计算技术实现数据的集中管理和共享可以提高数据利用效率和安全性;通过高效灵活的系统设计和可扩展性可以满足不同医疗机构的需求;通过移动性和智能化可以提高医疗服务的精准度和效率;通过集成性可以实现医疗服务的协同性和效率。因此,多医院版检验科云LIS系统源码将成为未来医疗机构信息化发展的重要方向之一。
47 2
|
1月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
24 1
|
1月前
|
存储 前端开发 数据库
MVC模式和三层架构
MVC模式和三层架构
42 2
|
29天前
|
JSON JavaScript 前端开发
技术经验分享:ExtJS4MVC架构讲解
技术经验分享:ExtJS4MVC架构讲解
12 0
|
2月前
|
前端开发 JavaScript 中间件
基于最新koa的Node.js后端API架构与MVC模式
基于最新koa的Node.js后端API架构与MVC模式
57 1
|
1月前
|
前端开发 测试技术 API
探索安卓应用的架构演进:从MVC到MVVM
本篇文章将深入探讨安卓应用开发中的架构演进,特别关注从传统的MVC(Model-View-Controller)到现代流行的MVVM(Model-View-ViewModel)架构的转变。通过对比两种架构的设计理念、实现方式和实际应用案例,解析MVVM在提高代码可维护性和可测试性方面的优势。
30 0
|
2月前
|
前端开发 Java 数据库
MVC架构简述
MVC架构简述
28 4
|
2月前
|
SQL 存储 缓存
SQL的基础架构
SQL的基础架构
|
2月前
|
XML 前端开发 Android开发
Android架构设计——MVC,滴滴 战略 面试
Android架构设计——MVC,滴滴 战略 面试