阿里云 > 教程中心 > 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猫