• 基于LINQ to SQL的WEB开发三层架构(1)


    http://developer.51cto.com/art/200905/122580.htm

    程序员不再受限于复杂的SQL脚本,而可以一种近乎完美的方式来搭建自己的面向对象型软件 系统,这种方式就是将数据完全对象化,将SQL语句封装到底层,由framework来完成,程序员 只需面向数据库对象来编程,从另一种意义上来说,是把数据也程序化了。

    LINQ的这种开发模式也改变了系统架构的搭建方式,在以往的系统中,数据访问层DAL 要访问数据字段,业务逻辑层BLL要得到数据都需要通过数据模型层Model来处理,而LINQ和 VS2008为我们带来了一种全新的自动化方式生成数据模型层,这就是dbml(Database Mark Language。数据库描述语言,是一种xml格式的文档,用来描述数据库),有了它我们就不需要 去找那些第三方的代码生成工具,只需要把数据表拖拽到设计器中,如下图所示,DONET便为我 们做好了一切。

    完成拖拽操作后,VS会自动生成一个数据模型层的dbml文件和相关的类文件。这样我们省去 了数据模型层的搭建,系统的架构也就有所不同,以下用一个例子简单的讲一下该架构模型。

    为了完成这个架构,我们首先要创建一个WEB APPLICATION项目,在新建项目窗口选择 “ASP.NET WEB应用程序”,为它取一个名字,并确定。

    接下来,在解决方案资源管理器中再添加一个类库项目,取名为DAL,如下图:

    再使用同样的方法在解决方案资源管理器中添加一个类库项目,取名为BLL,这样我们的基 础架构搭建完成,此时我们的解决方案资源管理器应该是如下结构。

    此时,我们先从DAL项目入手,在DAL项目中,添加一个LINQ TO SQL类,取名为Northwind( 为了方便起见,此项目使用SQL SERVER2005中的Northwind示例数据库),双击新建立的 Northwind.dbml文件,然后打开“服务器资源管理器”,建立与数据的连接,并从Northwind数 据库中,将Employees表拖拽到Northwind.dbml文件的可视化设计器中。

    初始的Northwind.dbml文件代码如下:

    #pragma warning disable 1591
    //-------------------------------------- ----------------------------------------
    //
    // 此代码由 工具生成。
    // 运行时版本:2.0.50727.3053
    //
    // 对此文件的更改可能会 导致不正确的行为,并且如果
    // 重新生成代码,这些更改将会丢失。
    //
    //----------------------------------------------------------------- -------------
    namespace DAL
    {
    using System.Data.Linq;
    using System.Data.Linq.Mapping;
    using System.Data;
    using System.Collections.Generic;
    using System.Reflection;
    using System.Linq;
    using System.Linq.Expressions;
    using System.ComponentModel;
    using System;
    [System.Data.Linq.Mapping.DatabaseAttribute(Name="Northwind")]
    public partial class NorthwindDataContext : System.Data.Linq.DataContext
    {
    private static System.Data.Linq.Mapping.MappingSource mappingSource = new AttributeMappingSource();
    #region Extensibility Method Definitions
    partial void OnCreated();
    partial void InsertEmployees(Employees instance);
    partial void UpdateEmployees(Employees instance);
    partial void DeleteEmployees(Employees instance);
    #endregion
    public NorthwindDataContext() :
    base (global::DAL.Properties.Settings.Default.NorthwindConnectionString, mappingSource)
    {
    OnCreated();
    }
    public NorthwindDataContext(string connection) :
    base(connection, mappingSource)
    {
    OnCreated();
    }
    public NorthwindDataContext(System.Data.IDbConnection connection) :
    base(connection, mappingSource)
    {
    OnCreated();
    }
    public NorthwindDataContext(string connection, System.Data.Linq.Mapping.MappingSource mappingSource) :
    base(connection, mappingSource)
    {
    OnCreated();
    }
    public NorthwindDataContext(System.Data.IDbConnection connection, System.Data.Linq.Mapping.MappingSource mappingSource) :
    base(connection, mappingSource)
    {
    OnCreated();
    }
    public System.Data.Linq.Table Employees
    {
    get
    {
    return this.GetTable();
    }
    }
    }
    [Table (Name="dbo.Employees")]
    public partial class Employees : INotifyPropertyChanging, INotifyPropertyChanged
    {
    private static PropertyChangingEventArgs emptyChangingEventArgs = new PropertyChangingEventArgs (String.Empty);
    private int _EmployeeID;
    private string _LastName;
    private string _FirstName;
    private string _Title;
    private string _TitleOfCourtesy;
    private System.Nullable _BirthDate;
    private System.Nullable _HireDate;
    private string _Address;
    private string _City;
    private string _Region;
    private string _PostalCode;
    private string _Country;
    private string _HomePhone;
    private string _Extension;
    private System.Data.Linq.Binary _Photo;
    private string _Notes;
    private System.Nullable _ReportsTo;
    private string _PhotoPath;
    #region Extensibility Method Definitions
    partial void OnLoaded ();
    partial void OnValidate(System.Data.Linq.ChangeAction action);
    partial void OnCreated();
    partial void OnEmployeeIDChanging(int value);
    partial void OnEmployeeIDChanged();
    partial void OnLastNameChanging(string value);
    partial void OnLastNameChanged();
    partial void OnFirstNameChanging(string value);
    partial void OnFirstNameChanged();
    partial void OnTitleChanging(string value);
    partial void OnTitleChanged ();
    partial void OnTitleOfCourtesyChanging(string value);
    partial void OnTitleOfCourtesyChanged();
    partial void OnBirthDateChanging (System.Nullable value);
    partial void OnBirthDateChanged ();
    partial void OnHireDateChanging(System.Nullable value);
    partial void OnHireDateChanged();
    partial void OnAddressChanging(string value);
    partial void OnAddressChanged();
    partial void OnCityChanging(string value);
    partial void OnCityChanged();
    partial void OnRegionChanging(string value);
    partial void OnRegionChanged();
    partial void OnPostalCodeChanging(string value);
    partial void OnPostalCodeChanged();
    partial void OnCountryChanging(string value);
    partial void OnCountryChanged();
    partial void OnHomePhoneChanging(string value);
    partial void OnHomePhoneChanged();
    partial void OnExtensionChanging(string value);
    partial void OnExtensionChanged();
    partial void OnPhotoChanging(System.Data.Linq.Binary value);
    partial void OnPhotoChanged();
    partial void OnNotesChanging (string value);
    partial void OnNotesChanged();
    partial void OnReportsToChanging(System.Nullable value);
    partial void OnReportsToChanged();
    partial void OnPhotoPathChanging(string value);
    partial void OnPhotoPathChanged();
    #endregion
    public Employees()
    {
    OnCreated();
    }
    [Column(Storage="_EmployeeID", DbType="Int NOT NULL", IsPrimaryKey=true)]
    public int EmployeeID
    {
    get
    {
    return this._EmployeeID;
    }
    set
    {
    if ((this._EmployeeID != value))
    {
    this.OnEmployeeIDChanging(value);
    this.SendPropertyChanging();
    this._EmployeeID = value;
    this.SendPropertyChanged("EmployeeID");
    this.OnEmployeeIDChanged();
    }
    }
    }
    [Column(Storage="_LastName", DbType="NVarChar(20) NOT NULL", CanBeNull=false)]
    public string LastName
    {
    get
    {
    return this._LastName;
    }
    set
    {
    if ((this._LastName != value))
    {
    this.OnLastNameChanging(value);
    this.SendPropertyChanging();
    this._LastName = value;
    this.SendPropertyChanged("LastName");
    this.OnLastNameChanged();
    }
    }
    }
    [Column (Storage="_FirstName", DbType="NVarChar(10) NOT NULL", CanBeNull=false)]
    public string FirstName
    {
    get
    {
    return this._FirstName;
    }
    set
    {
    if ((this._FirstName != value))
    {
    this.OnFirstNameChanging(value);
    this.SendPropertyChanging();
    this._FirstName = value;
    this.SendPropertyChanged("FirstName");
    this.OnFirstNameChanged();
    }
    }
    }
    [Column (Storage="_Title", DbType="NVarChar(30)")]
    public string Title
    {
    get
    {
    return this._Title;
    }
    set
    {
    if ((this._Title != value))
    {
    this.OnTitleChanging(value);
    this.SendPropertyChanging();
    this._Title = value;
    this.SendPropertyChanged("Title");
    this.OnTitleChanged();
    }
    }
    }
    [Column(Storage="_TitleOfCourtesy", DbType="NVarChar(25)")]
    public string TitleOfCourtesy
    {
    get
    {
    return this._TitleOfCourtesy;
    }
    set
    {
    if ((this._TitleOfCourtesy != value))
    {
    this.OnTitleOfCourtesyChanging(value);
    this.SendPropertyChanging();
    this._TitleOfCourtesy = value;
    this.SendPropertyChanged("TitleOfCourtesy");
    this.OnTitleOfCourtesyChanged ();
    }
    }
    }
    [Column(Storage="_BirthDate", DbType="DateTime")]
    public System.Nullable BirthDate
    {
    get
    {
    return this._BirthDate;
    }
    set
    {
    if ((this._BirthDate != value))
    {
    this.OnBirthDateChanging(value);
    this.SendPropertyChanging();
    this._BirthDate = value;
    this.SendPropertyChanged("BirthDate");
    this.OnBirthDateChanged();
    }
    }
    }
    [Column(Storage="_HireDate", DbType="DateTime")]
    public System.Nullable HireDate
    {
    get
    {
    return this._HireDate;
    }
    set
    {
    if ((this._HireDate != value))
    {
    this.OnHireDateChanging(value);
    this.SendPropertyChanging();
    this._HireDate = value;
    this.SendPropertyChanged("HireDate");
    this.OnHireDateChanged();
    }
    }
    }
    [Column (Storage="_Address", DbType="NVarChar(60)")]
    public string Address
    {
    get
    {
    return this._Address;
    }
    set
    {
    if ((this._Address != value))
    {
    this.OnAddressChanging(value);
    this.SendPropertyChanging();
    this._Address = value;
    this.SendPropertyChanged("Address");
    this.OnAddressChanged();
    }
    }
    }
    [Column(Storage="_City", DbType="NVarChar(15)")]
    public string City
    {
    get
    {
    return this._City;
    }
    set
    {
    if ((this._City != value))
    {
    this.OnCityChanging(value);
    this.SendPropertyChanging();
    this._City = value;
    this.SendPropertyChanged("City");
    this.OnCityChanged();
    }
    }
    }
    [Column(Storage="_Region", DbType="NVarChar(15)")]
    public string Region
    {
    get
    {
    return this._Region;
    }
    set
    {
    if ((this._Region != value))
    {
    this.OnRegionChanging(value);
    this.SendPropertyChanging();
    this._Region = value;
    this.SendPropertyChanged("Region");
    this.OnRegionChanged();
    }
    }
    }
    [Column(Storage="_PostalCode", DbType="NVarChar(10)")]
    public string PostalCode
    {
    get
    {
    return this._PostalCode;
    }
    set
    {
    if ((this._PostalCode != value))
    {
    this.OnPostalCodeChanging(value);
    this.SendPropertyChanging();
    this._PostalCode = value;
    this.SendPropertyChanged("PostalCode");
    this.OnPostalCodeChanged();
    }
    }
    }
    [Column (Storage="_Country", DbType="NVarChar(15)")]
    public string Country
    {
    get
    {
    return this._Country;
    }
    set
    {
    if ((this._Country != value))
    {
    this.OnCountryChanging(value);
    this.SendPropertyChanging();
    this._Country = value;
    this.SendPropertyChanged("Country");
    this.OnCountryChanged();
    }
    }
    }
    [Column(Storage="_HomePhone", DbType="NVarChar(24)")]
    public string HomePhone
    {
    get
    {
    return this._HomePhone;
    }
    set
    {
    if ((this._HomePhone != value))
    {
    this.OnHomePhoneChanging(value);
    this.SendPropertyChanging();
    this._HomePhone = value;
    this.SendPropertyChanged("HomePhone");
    this.OnHomePhoneChanged();
    }
    }
    }
    [Column (Storage="_Extension", DbType="NVarChar(4)")]
    public string Extension
    {
    get
    {
    return this._Extension;
    }
    set
    {
    if ((this._Extension != value))
    {
    this.OnExtensionChanging(value);
    this.SendPropertyChanging();
    this._Extension = value;
    this.SendPropertyChanged("Extension");
    this.OnExtensionChanged();
    }
    }
    }
    [Column(Storage="_Photo", DbType="Image", UpdateCheck=UpdateCheck.Never)]
    public System.Data.Linq.Binary Photo
    {
    get
    {
    return this._Photo;
    }
    set
    {
    if ((this._Photo != value))
    {
    this.OnPhotoChanging(value);
    this.SendPropertyChanging();
    this._Photo = value;
    this.SendPropertyChanged("Photo");
    this.OnPhotoChanged();
    }
    }
    }
    [Column(Storage="_Notes", DbType="NText", UpdateCheck=UpdateCheck.Never)]
    public string Notes
    {
    get
    {
    return this._Notes;
    }
    set
    {
    if ((this._Notes != value))
    {
    this.OnNotesChanging(value);
    this.SendPropertyChanging();
    this._Notes = value;
    this.SendPropertyChanged("Notes");
    this.OnNotesChanged();
    }
    }
    }
    [Column (Storage="_ReportsTo", DbType="Int")]
    public System.Nullable ReportsTo
    {
    get
    {
    return this._ReportsTo;
    }
    set
    {
    if ((this._ReportsTo != value))
    {
    this.OnReportsToChanging(value);
    this.SendPropertyChanging();
    this._ReportsTo = value;
    this.SendPropertyChanged("ReportsTo");
    this.OnReportsToChanged();
    }
    }
    }
    [Column(Storage="_PhotoPath", DbType="NVarChar(255)")]
    public string PhotoPath
    {
    get
    {
    return this._PhotoPath;
    }
    set
    {
    if ((this._PhotoPath != value))
    {
    this.OnPhotoPathChanging(value);
    this.SendPropertyChanging();
    this._PhotoPath = value;
    this.SendPropertyChanged("PhotoPath");
    this.OnPhotoPathChanged();
    }
    }
    }
    public event PropertyChangingEventHandler PropertyChanging;
    public event PropertyChangedEventHandler PropertyChanged;
    protected virtual void SendPropertyChanging()
    {
    if ((this.PropertyChanging != null))
    {
    this.PropertyChanging(this, emptyChangingEventArgs);
    }
    }
    protected virtual void SendPropertyChanged(String propertyName)
    {
    if ((this.PropertyChanged != null))
    {
    this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
    }
    }
    }
    #pragma warning restore 1591

    从中可以看到,这里本质上就是以前的数据模型层,将数据整个对象化了,为了层之间的访 问方便,我们将改类的命名空间改为Auto.DAL,并将NorthwindDataContent类的第一个构造函 数代码修改如下,这样修改主要是为了统一数据库连接字符串的位置,因为dbml文件在生成后 会附带生成一个app.config文件,用来存放连接字符串,而我们要把连接字符串统一放到 web.config中。(要访问web.config文件,需要为DAL项目添加对System.Configuration的应用 )

    public NorthwindDataContext() :
    base (ConfigurationManager.ConnectionStrings ["NorthwindConnectionString"].ConnectionString, mappingSource)
    {
    OnCreated ();
    }
     
    完成前面的操作以后,开始建立数据访问层的类文件,这时,先在 DAL项目下添加一个类文件,取名为DALEmployees.cs,其代码如下:
     
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    namespace Auto.DAL
    {
    public class DALEmployees
    {
    ///
    /// VS自动生成的数据模型
    ///
    NorthwindDataContext db = new NorthwindDataContext();
    ///
    /// 根据条件获取数据列表方法
    ///
    ///城 市地址
    /// 获取的Employees数据列表
    public IQueryable GetList(string strCity)
    {
    //根据城市地质,通过LINQ返 回数据
    return from p in db.Employees
    where p.City == strCity
    select p;
    }
    }
    }

    这个数据访问层中只建立了一个用来根据城市地址获取Employee数据的方法,它内部执行一 段LINQ,返回一个IQueryable型的结果,由于LINQ后期编译的特性,这个结果只有在程序运行 后才会返回数据集。

    接着,建立业务逻辑层,在BLL项目中,添加一个类文件,取名为BLLEmployees.cs,其代码 如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using Auto.DAL;
    namespace Auto.BLL
    {
    public class BLLEmployees
    {
    ///
    /// 通过城市名获得Employee数据
    ///
    ///城市名
    /// 数据 结果
    public IQueryable GetList(string strCity)
    {
    DALEmployees de=new DALEmployees();
    //调用数据访问层的方法
    return de.GetList(strCity);
    }
    }
    }

    这段代码完成了业务逻辑层的定义,建立了一个和数据访问层的同名方法GetList,用来传 送城市名称参数。最后,在WEB Application项目中,添加对BLL层的应用,并在Default.aspx 页面中添加一个GridView控件用来显示数据,Default.aspx.cs的代码如下:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using Auto.BLL;
    namespace WebApplication2
    {
    public partial class _Default : System.Web.UI.Page
    {
    protected void Page_Load(object sender, EventArgs e)
    {
    if (!IsPostBack)
    {
    GetList("London");
    }}
    ///
    /// 根据城市获取数据
    ///
    ///
    城市名称
    private void GetList(string strCity)
    {
    //执行业务逻辑层的方法
    BLLEmployees bl = new BLLEmployees();
    //绑 定到GridView1控件
    GridView1.DataSource = bl.GetList (strCity);
    GridView1.DataBind();
    }}}
    
    

    完成后,执行程序,便可得到相关数据,整个程序的结构如下:

    总结:实际上,这个基于LINQ的架构是将数据模型层和数据访问层整合到一个项目中,它的 特点就是开发快速,效率高,可以很方便的帮你完成数据模型的搭建,并且也便于后期修改, 当数据表发生变动时,只选要修改dbml文件就可以了。但这个架构里有些地方还是不大完善, 例如城市数据作为参数,应该也是以数据模型的方式来传送,但这里仅是按字符串传递,这样 不利于数据的封装和安全。因此还需要在此处改进。总体来说,比以往的三层架构结构更加清 晰了,如果再结合ASP.NET MVC架构来使用,就更加完美了。

    【编辑推荐】

    1. 使用LINQ查询非泛型类型
    2. 详解在ASP.NET中用LINQ实现数据处理
    3. 手把手教你用好LINQ to SQL
  • 相关阅读:
    要想成为前端大神,那些你不得不知晓的web前端命名规范。
    正确开启Mockjs的三种姿势:入门参考(一)
    1024码农节-向自己致敬!
    ES6 常用总结(前端开发js技术进阶提升总结)
    JS快速构建数组方法
    React绑定事件动态化的实现方法
    JQ遇到$(‘.xxx’).attr(‘display’)一直返回undefined
    你所要掌握的最简单基础的React渲染优化
    MyBatis Generator
    Spring boot集成redis初体验
  • 原文地址:https://www.cnblogs.com/chulia20002001/p/2349944.html
Copyright © 2020-2023  润新知