ASP.NET MVC三層架構基礎詳細操作圖文教程(VS2017)(1)

阿里雲 > 教程中心 > net教程 > ASP.NET MVC三層架構基礎詳細操作圖文教程(VS2017)(1)
ASP.NET MVC三層架構基礎詳細操作圖文教程(VS2017)(1)

關鍵字:

發表文章
摘要:作者marker歡迎轉載!!!參照原文地址:ASP.NET三層架構基礎詳細操作圖文教程(一)作者:喬楊 出自:http://www.cnntec.com 作者:AZ貓轉發請註明出處,違者必究本文主要講述Asp.netMVC B/S結構下基礎的三層架構項目。三層主要是指的界面UI層,邏輯層,數據層。界面UI層:用於用戶觀看,體驗的表示層。邏輯層:程序運行邏輯的封裝層。數據層:程序數據相關操作的封裝層。每層當中還可以進行不同的詳細劃分,因爲是基礎教程
作者marker 歡迎轉載!!!

參照原文地址:ASP.NET三層架構基礎詳細操作圖文教程(一)作者:喬楊 出自:http://www.cnntec.com 作者:AZ貓 轉發請註明出處,違者必究

本文主要講述Asp.net MVC B/S結構 下基礎的三層架構項目。
三層主要是指的界面UI層,邏輯層,數據層。
界面UI層:用於用戶觀看,體驗的表示層。
邏輯層:程序運行邏輯的封裝層。
數據層:程序數據相關操作的封裝層。

每層當中還可以進行不同的詳細劃分,因爲是基礎教程,先領新手入門,所以不進行復雜的講解。
準備工具:
Microsoft Visual Studio 2017以下簡稱vs2017
Microsoft SQLServer 2016 以下簡稱 數據庫
安裝就不詳說了。
首先,我們新建一個項目:如下圖

打開VS2017後,點擊創建項目,選擇C#中的web項目,選擇ASP.NET web應用程序,填寫名稱爲StudyCSharp.Web

選擇保存的路徑,填寫解決方案名稱StudyCSharp,記得勾下創建解決方雜的選項。確定建好項目後,選擇MVC模版,

右側的解決方案資源管理器如下圖

現在我們要對項目進行三層架構,剛纔我們在創建項目的時候,已經創建了UI層,即web項目。
現在我們要創建BLL層和DAL層等 。如下圖

左側,我們選擇Visual C#項目,右則我們選擇類庫。
然後在名稱中輸入StudyCSharp.BLL
路徑地址可以不用更改。

根據以上操作,我們再創建StudyCSharp.DAL和StudyCSharp.Entity及StudyCSharp.Utility
創建完如下圖:

各項目說明:
StudyCSharp.Web項目:表示層,用於顯示給用戶觀看和操作體驗的
StudyCSharp.BLL項目:邏輯層,程序實現邏輯
StudyCSharp.DAL項目:數據層,程序數據相關操作封裝
StudyCSharp.Entity項目:實體類,映射數據庫表結構
StudyCSharp.Utility項目:實用應用層,封裝相關應用操作

到此爲止,三層的框架已經搭建好了,但是還不能正常運用,我們還要進行一些配置和修改。
首選,我們修改DAL層,刪除默認的Class1.cs文件,新建SQLHelper.cs類和Configuration.cs類。
以下是Coniguration.cs類內容

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;

namespace StudyCSharp.DAL
{

public partial class Configuration
{
    public static string DateFormat
    {
        get
        {
            string formatStr = System.Configuration.ConfigurationManager.AppSettings["DateFormat"];
            if (formatStr == null)
            {
                return "yyyy/MM/dd HH:mm";
            }
            return "yyyy/MM/dd HH:mm";
        }
    }

    private static string mConnectionString = string.Empty;
    public static string ConnectionString
    {
        get
        {
            if (mConnectionString == string.Empty)
            {
                mConnectionString = System.Configuration.ConfigurationManager.AppSettings["ConnectionString"];
            }

            return mConnectionString;
        }
        set
        {
            mConnectionString = value;
        }
    }

    static EnumNetDbType mDbType = EnumNetDbType.Sql;
    public static EnumNetDbType DbType
    {
        get
        {
            return mDbType;
        }
        set
        {
            mDbType = value;
        }
    }

    //public static int GetOracleSequenceNextValue(string sequenceName)
    //{
    //    string sequel = "select  " + sequenceName + ".nextval from dual";
    //    return (int)(OracleHelper.ExecuteScalar(ConnectionString, CommandType.Text, sequel));
    //}

}
public enum EnumNetDbType
{
    Sql = 0,
    Oracle = 1,
    OleDb = 2
}
public enum EnumPersistStatus
{
    New = 0,
    Update = 1,
    Delete = 2
}

}
添加完2個類後,我們需對DAL項目的引用文件夾點右鍵,選擇添加引用。如圖

選擇System.Configuration,確定,OK,完成以後我們再繼續來配置web項目下的web.config文件,主要是連接數據庫。
如下圖

在appSettings節點下。原節點爲

OK,現在我們來配置實體類。
實體類爲數據庫表的映射,即與數據庫的表對應。
我們建立數據庫爲StudyCSharp,建立表爲UserInformation
具體建表一下會兒給出代碼。
我們在Entity項目上點擊右鍵,選擇添加類,然後寫入如下圖數據。
與數據庫中表UserInformation對應。如下:
public class UserInformation

{

 public int ID{get;set;}

 public string UserName{get;set;}

 public string UserPassword{get;set;}

}

們做了這個數據庫的實體映射後我們要怎麼用呢?怎麼才能操作這個實體像在操作數據庫一樣的呢?
我們馬上來配置DAL項目。
對DAL項目右鍵,選擇新建類.因爲是直接項目右鍵,所以不用做選擇。直接輸入名稱即可
這裏我們是操作的UserInformation所以我們類名命名爲Userinformation_DAL.cs,確定
如下圖:
然後在類中,我們添加如下名命空間的引用:

Using System.Data;
Using System.Data.SqlClient;
並將類前面加上public,繼續添加引用

在彈出的對話框中,我們選擇項目欄,選中剛纔我們建立的項目的映射類
如下圖

需要的數據庫腳本如下。
創建表和相關存儲過程。這個不是我們主講的核心,所以略過,附上腳本。

USE [StudyCSharp]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[SC_Userinformation](

[ID] [int] IDENTITY(1,1) NOT NULL,
[UserName] [nvarchar](32) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
[UserPassword] [nvarchar](128) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,

CONSTRAINT [PK_SC_Userinformation] PRIMARY KEY CLUSTERED
(

[ID] ASC

)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

USE [StudyCSharp]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_SelectAllFromUserinformation]
AS
BEGIN

    Select * from SC_userinformation

END

USE [StudyCSharp]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_SelectAllFromUserinformationById]

    @UID int        

AS
BEGIN

    Select * from SC_userinformation where id=@UID

END

USE [StudyCSharp]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_InsertUserinformation]

    @ID int=null,
    @UserName nvarchar(32),
    @UserPassword nvarchar(128)

AS
BEGIN

    Insert into SC_Userinformation
    (
            UserName,
            UserPassword
    )
    values
    (
            @UserName,
            @UserPassword
    )
    select @@identity as 'identity'

END

USE [StudyCSharp]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_UpdateUserinformation]

    @ID int,
    @UserName nvarchar(32),
    @UserPassword nvarchar(128)

AS
BEGIN

    Update SC_Userinformation
    SET UserName=@UserName,
            UserPassword=@UserPassword
    where ID=@ID

END

USE [StudyCSharp]
GO

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[SP_UserLogin]

    @UserName nvarchar(32),
    @UserPassword nvarchar(128)

AS
BEGIN

    select count(id)
    from SC_UserInformation
    where username=@UserName
    and userPassword=@UserPassword

END
複製代碼
存儲過程相關調用,詳細Userinformation_DAL.cs中的說明。

附上Userinformation_DAL.cs文件內容如下

using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.SqlClient;

namespace StudyCSharp.DAL
{

public partial class Userinformation_DAL
{
    /// <summary>
    /// 用戶登錄驗證
    /// </summary>
    /// <param name="userName">用戶名</param>
    /// <param name="userPassword">密碼</param>
    /// <returns>布爾值True成功</returns>
    public static bool UserLogin(string userName, string userPassword)
    {
        string sequel = "SP_UserLogin";
        SqlParameter[] paras = new SqlParameter[]
        {
            new SqlParameter("@UserName", userName),
            new SqlParameter("@UserPassword",userPassword)
        };
        int result =(int)SqlHelper.ExecuteScalar(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras);
        if (result > 0)
        {
            return true;
        }
        else
        {
            return false;
        }
    }

    /// <summary>
    /// 添加新用戶
    /// </summary>
    /// <param name="ui">用戶信息實體</param>
    /// <returns>用戶編號</returns>
    public static int CreateUserInfo(StudyCSharp.Entity.UserInformation ui)
    {
        string sequel = "SP_InsertUserinformation";
        SqlParameter[] paras = (SqlParameter[])ValueParas(ui);
        int result = SqlHelper.ExecuteNonQuery(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras);
        return result;
    }
    /// <summary>
    /// 獲取用戶所有信息
    /// </summary>
    /// <returns>泛型實體</returns>
    public static List<StudyCSharp.Entity.UserInformation> GetAllUserInfo()
    {
        string sequel = "SP_SelectAllFromUserinformation";            
        DataTable dt = SqlHelper.ExecuteDataSet(Configuration.ConnectionString, CommandType.StoredProcedure, sequel,null).Tables[0];
        return LoadListFromDataView(dt.DefaultView);
    }

    /// <summary>
    /// 獲取用戶所有信息同上,不同的是不是調用的存儲過程,而是直接拼寫的SQL
    /// </summary>
    /// <returns>DataTable</returns>
    public static DataTable GetAllUserInfoBySql()
    {
        string sequel = "Select * from SC_UserInformation";
        DataTable dt = SqlHelper.ExecuteDataSet(Configuration.ConnectionString, CommandType.Text, sequel, null).Tables[0];
        return dt;
    }
    /// <summary>
    /// 獲取某用戶信息
    /// </summary>
    /// <param name="empId">用戶id</param>
    /// <returns>用戶信息實體</returns>
    public static StudyCSharp.Entity.UserInformation GetUserInfoByEmpId(string empId)
    {
        string sequel = "SP_SelectAllFromUserinformationById";
        SqlParameter[] paras = new SqlParameter[] { new SqlParameter("@UID", empId) };
        DataTable dt = SqlHelper.ExecuteDataSet(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras).Tables[0];
        if (dt.Rows.Count == 0)
        {
            return null;
        }
        else
        {
            DataRow row = dt.Rows[0];
            return GetEntity(row);
        }
    }

    /// <summary>
    /// 更新用戶信息
    /// </summary>
    /// <param name="ui">用戶實體</param>
    /// <returns>影響行數</returns>
    public static int UpdateUserInfo(StudyCSharp.Entity.UserInformation ui)
    {
        string sequel = "SP_UpdateUserinformation";
        SqlParameter[] paras = (SqlParameter[])ValueParas(ui);
        int result = SqlHelper.ExecuteNonQuery(Configuration.ConnectionString, CommandType.StoredProcedure, sequel, paras);
        return result;  
    }

    /// <summary>
    /// 將DataView轉換爲泛型實體對象
    /// </summary>
    /// <param name="dv">DataView</param>
    /// <returns>泛型實體對象</returns>
    private static List<StudyCSharp.Entity.UserInformation> LoadListFromDataView(DataView dv)
    {
        List<StudyCSharp.Entity.UserInformation> list = new List<StudyCSharp.Entity.UserInformation>();
        for (int index = 0; index <= dv.Count - 1; index++)
        {
            list.Add(GetEntity(dv[index].Row));
        }
        return list;
    }

            /// <summary>
            /// 從DataReader中讀取數據映射到實體類的屬性中
            /// </summary>
            /// <remarks></remarks>
            private static StudyCSharp.Entity.UserInformation GetEntity(IDataReader dataReader)
            {
                    StudyCSharp.Entity.UserInformation _obj = new StudyCSharp.Entity.UserInformation();
                    if (!dataReader["ID"].Equals(DBNull.Value))
                            _obj.ID = Convert.ToInt32(dataReader["ID"]);
                    if (!dataReader["UserName"].Equals(DBNull.Value))
                            _obj.UserName = Convert.ToString(dataReader["UserName"]);
                    if (!dataReader["UserPassword"].Equals(DBNull.Value))
                            _obj.UserPassword = Convert.ToString(dataReader["UserPassword"]);
                    return _obj;
            }
            /// <summary>
            /// 從行中讀取數據映射到實體類的屬性中
            /// </summary>
            /// <remarks></remarks>
            private static StudyCSharp.Entity.UserInformation GetEntity(DataRow row)
            {
                    StudyCSharp.Entity.UserInformation _obj = new StudyCSharp.Entity.UserInformation();
                    if (!row["ID"].Equals(DBNull.Value))
                            _obj.ID = Convert.ToInt32(row["ID"]);
                    if (!row["UserName"].Equals(DBNull.Value))
                            _obj.UserName = Convert.ToString(row["UserName"]);
                    if (!row["UserPassword"].Equals(DBNull.Value))
                            _obj.UserPassword = Convert.ToString(row["UserPassword"]);
                    return _obj;
            }

            /// <summary>
            /// 該數據訪問對象的屬性值裝載到數據庫更新參數數組Insert用
            /// </summary>
            /// <remarks></remarks>
            private static IDbDataParameter[] ValueParas(StudyCSharp.Entity.UserInformation _obj)
            {
                    SqlParameter[] paras = new SqlParameter[3];
                    paras[0] = new SqlParameter("@ID", _obj.ID);
                    paras[1] = new SqlParameter("@UserName", _obj.UserName);
                    paras[2] = new SqlParameter("@UserPassword", _obj.UserPassword);

                    paras[0].DbType = DbType.Int32;
                    paras[1].DbType = DbType.String;
                    paras[2].DbType = DbType.String;

                    return paras;
            }
    }

}
下篇解析三層架構的DAL及BLL還有WEB之間的關係和調用。
轉載自 作者:喬楊 出自:http://www.cnntec.com 作者:AZ貓

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章