65.9K
CodeProject 正在变化。 阅读更多。
Home

ASP.NET C# 中面向初学者的三层架构

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.11/5 (6投票s)

2015年1月19日

CPOL

3分钟阅读

viewsIcon

41294

downloadIcon

423

用三层架构代码风格开发 Web 应用程序

引言

本技巧简要概述了以三层架构编程风格开发 Web 应用程序。三层架构分为以下 3 个部分。

背景

  1. DataAccessLayer:这也被称为应用程序的 DAL 层,提供所有数据库相关操作的性能,如插入记录、删除记录、编辑记录和更新记录。此层提供从数据库访问数据。数据集从 DAL 层传递到业务层。
  2. BusinessLogicLayer:此层提供如何在 Web 应用程序中添加与业务相关的逻辑。与业务相关的逻辑包含循环结构(forwhile 等)的逻辑,这些逻辑在一个类文件中执行所有项目逻辑。BL 层获取由 DAL 层返回的 Dataset,然后将其转换为该特定文件的等效 List (li) 对象。
  3. PresentationLayer:此层在客户端提供设计,并获取从业务层返回的 List,然后实现您要执行的显示功能、插入功能、编辑功能等。在下面的图像中,显示了这三层。

Using the Code

  1. 为了使应用程序更容易理解。
  2. 易于维护,易于修改应用程序,我们可以保持良好的架构外观。

使用三层架构开发风格,您的 Web 应用程序扩展将易于实现新的更改。在三层中,开发应用程序需要以下类文件。下面的快照显示了您必须在应用程序中添加的所有三个文件。

步骤 1

添加连接文件以创建与 SQL 数据库的连接。文件名是 ClassMain.cs

声明两个命名空间

Using system.data;
Using system,data.sqlclient;

Class_Main.CS

 SqlConnection cn = new SqlConnection(@"Data Source=JATINKHIMANI-PC\JATINKHIMANI;
    Initial Catalog=mydatabase;Integrated Security=True");
   // SqlConnection cn = new SqlConnection(@"Data Source=JTINKHIMANI-PC\SQLEXPRESS;
    Initial Catalog=SaffronyFeedback;Integrated Security=True");
    
    public Class_Main()
    {
        //
        // TODO: Add constructor logic here
        //
    }
 
    #region QueryFunctions
 
    public void insert(string que)
    {
        cn.Open();
        SqlCommand cmd = new SqlCommand(que,cn);
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        cn.Close();
    }
 
    public void delete(string que)
    {
        cn.Open();
        SqlCommand cmd = new SqlCommand(que, cn);
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        cn.Close();
    }
 
    public void update(string que)
    {
        cn.Open();
        SqlCommand cmd = new SqlCommand(que, cn);
        cmd.ExecuteNonQuery();
        cmd.Dispose();
        cn.Close();
    }
 
    public DataSet select(string que)
    {
        SqlDataAdapter ad = new SqlDataAdapter(que,cn);
        DataSet ds = new DataSet();
        ad.Fill(ds);
        return ds;
    }
 
    #endregion  

第二步

添加另一个文件,用于从连接文件访问数据。这用于执行与数据库相关的功能,如插入、更新、删除和选择。

DL_Marksheet.cs

public DL_Marksheet()
    {
        //
        // TODO: Add constructor logic here
        //
    }
 
    // Made Function and pass BL's Object (blm).........................
    public static void MarksheetInsert(BL_Marksheet blm)
    {
        // Call ClassFile .......................
        Class_Main cm = new Class_Main();
        cm.insert("insert into marksheet(rollno,name,maths,science,english) values
            ("+blm.Rollno+",'"+blm.Name+"',
            "+blm.Maths+","+blm.Science+","+blm.English+")");
    } 

    public static DataSet MarksheetSelect()
    {
        Class_Main cm = new Class_Main();
        DataSet ds = cm.select("select * from marksheet");
        return ds;
    }
 
    public static DataSet MarksheetSelect(string rollno)
    {
        Class_Main cm = new Class_Main();
        DataSet ds = cm.select("select * from marksheet where rollno="+rollno+"");
        return ds;
    }
 
    public static void MarksheetDelete(string rollno)
    {
        Class_Main cm = new Class_Main();
        cm.delete("delete from marksheet where rollno=" + rollno + "");
    }   

步骤 3

在此处添加与业务相关的逻辑,用于从数据库显示记录,将 dataset 转换为有效对象的 List,然后将该列表传递给表示层以显示记录。

BL_Marksheet.cs

 private int rollno;
    private string name;
    private int maths;
    private int science;
    private int english;
    
    public BL_Marksheet()
    {
        //
        // TODO: Add constructor logic here
        //
    }
 
    // Create All Fields Property as shown below.................
    public int Rollno 
    { 
        get
        {
            return rollno;
        }
        set 
        {
            this.rollno = value;
        } 
    }
 
    public string Name
    {
        get 
        {
            return name;
        }
        set
        {
            this.name = value;
        }
    }
 
    public int Maths
    {
        get 
        {
            return maths;
        }
        set 
        {
            this.maths = value;
        }
    }
 
    public int Science 
    {
        get 
        {
            return science;
        }
        set 
        {
            this.science = value;
        } 
    }
 
    public int English
    {
        get 
        {
            return english;
        }
        set 
        {
            this.english = value;
        }
    }
 
    // Made function for Insert Data..................

    public static void MarksheetInsert(BL_Marksheet blm)
    {
        // Call DL's Insert function and Pass Bl's Object (blm)........................
        DL_Marksheet.MarksheetInsert(blm);
    }
 
    public static List<BL_Marksheet> MarksheetSelect()
    {
        // create LIST object li  that is ........
        List<BL_Marksheet> li = new List<BL_Marksheet>();
 
        Class_Main cm = new Class_Main();
        // put DL's dataset into ds..........
        DataSet ds = DL_Marksheet.MarksheetSelect();
        
        for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
        {  
            BL_Marksheet blm = new BL_Marksheet();
 
            DataRow dr = ds.Tables[0].Rows[i];
 
            blm.Rollno = int.Parse(dr["rollno"].ToString());
            blm.Name = dr["name"].ToString();
            blm.Maths = int.Parse(dr["maths"].ToString());
            blm.Science = int.Parse(dr["science"].ToString());
            blm.English = int.Parse(dr["english"].ToString());
 
            // Another Way..............
            //blm.Rollno = int.Parse(ds.Tables[0].Rows[i]["rollno"].ToString());
            //blm.Name =ds.Tables[0].Rows[i]["name"].ToString();
            //blm.Maths = int.Parse(ds.Tables[0].Rows[i]["maths"].ToString());
            //blm.Science = int.Parse(ds.Tables[0].Rows[i]["science"].ToString());
            //blm.English = int.Parse(ds.Tables[0].Rows[i]["english"].ToString());

            // ADd BL's object (blm) to List (li)..................
            li.Add(blm);
        }
 
        // Return List (li) to Presentation Page.......
        return li;
    } 

    public static List<BL_Marksheet> MarksheetSelect(string rollno)
    {
        List<BL_Marksheet> li = new List<BL_Marksheet>();
 
        Class_Main cm = new Class_Main();
 
        DataSet ds=DL_Marksheet.MarksheetSelect(rollno);
 
        for (int i = 0; i <= ds.Tables[0].Rows.Count - 1; i++)
        {
            BL_Marksheet blm = new BL_Marksheet();
 
            blm.Rollno = int.Parse(ds.Tables[0].Rows[i]["rollno"].ToString());
            blm.Name = ds.Tables[0].Rows[i]["name"].ToString();
            blm.Maths = int.Parse(ds.Tables[0].Rows[i]["maths"].ToString());
            blm.Science = int.Parse(ds.Tables[0].Rows[i]["science"].ToString());
            blm.English = int.Parse(ds.Tables[0].Rows[i]["english"].ToString());
 
            li.Add(blm);
        }
        return li;
    }
    public static void MarksheetDelete(string rollno)
    {
        DL_Marksheet.MarksheetDelete(rollno);
    }  

步骤 4

编写代码,用于在表示文件中添加记录,以设计插入记录的表单。

<table align="center" border="1" cellpadding="4" cellspacing="1">
            <tr>
                <td align="justify">
                    <asp:Label ID="Label1" runat="server" Text="RollNo"></asp:Label>
                </td>
                <td align="justify">
                    <asp:TextBox ID="txtrollno" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td align="justify">
                    <asp:Label ID="Label2" runat="server" Text="Name"></asp:Label>
                </td>
                <td align="justify">
                    <asp:TextBox ID="txtname" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td align="justify">
                    <asp:Label ID="Label3" runat="server" Text="MAths"></asp:Label>
                </td>
                <td align="justify">
                    <asp:TextBox ID="txtmaths" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td align="justify">
                    <asp:Label ID="Label4" runat="server" Text="Science"></asp:Label>
                </td>
                <td align="justify">
                    <asp:TextBox ID="txtscience" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td align="justify">
                    <asp:Label ID="Label5" runat="server" Text="English"></asp:Label>
                </td>
                <td align="justify">
                    <asp:TextBox ID="txtenglish" runat="server"></asp:TextBox>
                </td>
            </tr>
            <tr>
                <td align="justify" colspan="2">
                    <asp:Button ID="btnsubmit" runat="server" onclick="btnsubmit_Click" 
                        Text="SUBMIT" Width="100px" />
                </td>
            </tr>
            <tr>
                <td align="justify" colspan="2">
                    <asp:GridView ID="gridmarksheet" runat="server" AutoGenerateColumns="False" 
                        BackColor="White" BorderColor="#DEDFDE" BorderStyle="None" BorderWidth="1px" 
                        CellPadding="4" ForeColor="Black" GridLines="Vertical">
                        <AlternatingRowStyle BackColor="White" />
                        <Columns>
                            <asp:BoundField DataField="rollno" HeaderText="RollNo" />
                            <asp:BoundField DataField="name" HeaderText="Name" />
                            <asp:BoundField DataField="maths" HeaderText="Maths" />
                            <asp:BoundField DataField="science" HeaderText="Science" />
                            <asp:BoundField DataField="english" HeaderText="English" />
                        </Columns>
                        <FooterStyle BackColor="#CCCC99" />
                        <HeaderStyle BackColor="#6B696B" Font-Bold="True" ForeColor="White" />
                        <PagerStyle BackColor="#F7F7DE" ForeColor="Black" HorizontalAlign="Right" />
                        <RowStyle BackColor="#F7F7DE" />
                        <SelectedRowStyle BackColor="#CE5D5A" Font-Bold="True" ForeColor="White" />
                        <SortedAscendingCellStyle BackColor="#FBFBF2" />
                        <SortedAscendingHeaderStyle BackColor="#848384" />
                        <SortedDescendingCellStyle BackColor="#EAEAD3" />
                        <SortedDescendingHeaderStyle BackColor="#575357" />
                    </asp:GridView>
                </td>
            </tr>
        </table> 

步骤 5

将以下 cs 代码添加到表示文件 .cs 表单中。在这里,我运行了插入和显示记录数据,如果您想编辑和删除该显示数据,只需调用我已经写入 BLMarksheet.CS 文件中的函数。

 Class_Main cm = new Class_Main();
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            DisplayData();
        }
    }
    public void DisplayData()
    {
        List<BL_Marksheet> li = new List<BL_Marksheet>();
        li = BL_Marksheet.MarksheetSelect();
        gridmarksheet.DataSource = li;
        gridmarksheet.DataBind();
    }
    protected void btnsubmit_Click(object sender, EventArgs e)
    {
        try
        {
            // CALL Bussiness Layer(BL) 
            BL_Marksheet blm = new BL_Marksheet();
            // Passing Values To BL 
            blm.Rollno = int.Parse(txtrollno.Text);
            blm.Name = txtname.Text;
            blm.Maths = int.Parse(txtmaths.Text);
            blm.Science = int.Parse(txtscience.Text);
            blm.English = int.Parse(txtenglish.Text);
 
            // CAll (DL)Data Layer's insert function and PAss BL Object (blm)
            DL_Marksheet.MarksheetInsert(blm);
            DisplayData();
            Response.Write("<script>alert('Record Inserted...')</script>");
            Clear();
        }
        catch (Exception)
        {
            Response.Write("<script>alert('Try Again...')</script>");
            Clear();
        }
    }
    public void Clear()
    {
        txtrollno.Text = "";
        txtname.Text = "";
        txtmaths.Text = "";
        txtscience.Text = "";
        txtenglish.Text = "";
        txtrollno.Focus();
    } 

我已对上述代码进行了更改,如果您想查看,请下载我上传的演示代码。

关注点

在许多文章中,有许多其他类型的 3 层代码风格可用,但我认为它非常有效,并且包含最少的代码来实现 3 层架构。这对于不熟悉 ASP.NET 中新代码风格的初学者来说非常有用。许多新开发人员都在努力开发它,所以我已经完成了并发布了它供所有人使用。

历史

  • 2015 年 1 月 19 日:第一个版本

谢谢!

Jatin Khimani

© . All rights reserved.