一步一步学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






  

目录
相关文章
|
5月前
|
设计模式 存储 前端开发
MVVM、MVC、MVP三种常见软件架构设计模式的区别
MVC、MVP 和 MVVM 是三种常见的软件架构设计模式,主要通过分离关注点的方式来组织代码结构,优化开发效率。
122 12
|
15天前
|
存储 前端开发 调度
Flux 与传统的 MVC 架构模式区别
Flux是一种用于构建用户界面的架构模式,与传统的MVC架构不同,它采用单向数据流,通过Dispatcher统一管理数据的分发,Store负责存储数据和业务逻辑,View只负责展示数据,使得应用状态更加可预测和易于维护。
|
3月前
|
设计模式 前端开发 数据库
哇塞!Rails 的 MVC 架构也太牛了吧!快来看看这令人惊叹的编程魔法,开启新世界大门!
【8月更文挑战第31天】《Rails中的MVC架构解析》介绍了Ruby on Rails框架核心的MVC设计模式,通过模型(Model)、视图(View)和控制器(Controller)三部分分离应用逻辑,利用Active Record进行数据库操作,ERB模板渲染视图,以及控制器处理用户请求与业务逻辑,使代码更易维护和扩展,提升团队开发效率。
69 0
|
15天前
|
存储 前端开发 数据可视化
在实际项目中,如何选择使用 Flux 架构或传统的 MVC 架构
在实际项目中选择使用Flux架构或传统MVC架构时,需考虑项目复杂度、团队熟悉度和性能需求。Flux适合大型、高并发应用,MVC则适用于中小型、逻辑简单的项目。
|
2月前
|
设计模式 前端开发 数据库
理解mvc架构
mvc架构
30 4
|
3月前
|
设计模式 存储 前端开发
MVC革命:如何用一个设计模式重塑你的应用架构,让代码重构变得戏剧性地简单!
【8月更文挑战第22天】自定义MVC(Model-View-Controller)设计模式将应用分为模型、视图和控制器三个核心组件,实现关注点分离,提升代码可维护性和扩展性。模型管理数据和业务逻辑,视图负责数据显示与用户交互,控制器处理用户输入并协调模型与视图。通过示例代码展示了基本的MVC框架实现,可根据需求扩展定制。MVC模式灵活性强,支持单元测试与多人协作,但需注意避免控制器过度复杂化。
42 1
|
3月前
|
开发者 前端开发 Java
架构模式的诗与远方:如何在MVC的田野上,用Struts 2编织Web开发的新篇章
【8月更文挑战第31天】架构模式是软件开发的核心概念,MVC(Model-View-Controller)通过清晰的分层和职责分离,成为广泛采用的模式。随着业务需求的复杂化,Struts 2框架应运而生,继承MVC优点并引入更多功能。本文探讨从MVC到Struts 2的演进,强调架构模式的重要性。MVC将应用程序分为模型、视图和控制器三部分,提高模块化和可维护性。
47 0
|
3月前
|
存储 前端开发 数据库
神秘编程世界惊现强大架构!Web2py 的 MVC 究竟隐藏着怎样的神奇魔力?带你探索实际应用之谜!
【8月更文挑战第31天】在现代 Web 开发中,MVC(Model-View-Controller)架构被广泛应用,将应用程序分为模型、视图和控制器三个部分,有助于提高代码的可维护性、可扩展性和可测试性。Web2py 是一个采用 MVC 架构的 Python Web 框架,其中模型处理数据和业务逻辑,视图负责呈现数据给用户,控制器则协调模型和视图之间的交互。
40 0
|
4月前
|
存储 前端开发 算法
MVC(Model-View-Controller)架构
MVC架构帮助开发者构建清晰、可维护和可扩展的Web应用程序。
40 2
|
5月前
|
设计模式 前端开发 Java
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
【Spring MVC】快速学习使用Spring MVC的注解及三层架构
75 1

热门文章

最新文章