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猫

相关实践学习
DataV Board用户界面概览
本实验带领用户熟悉DataV Board这款可视化产品的用户界面
阿里云实时数仓实战 - 项目介绍及架构设计
课程简介 1)学习搭建一个数据仓库的过程,理解数据在整个数仓架构的从采集、存储、计算、输出、展示的整个业务流程。 2)整个数仓体系完全搭建在阿里云架构上,理解并学会运用各个服务组件,了解各个组件之间如何配合联动。 3&nbsp;)前置知识要求 &nbsp; 课程大纲 第一章&nbsp;了解数据仓库概念 初步了解数据仓库是干什么的 第二章&nbsp;按照企业开发的标准去搭建一个数据仓库 数据仓库的需求是什么 架构 怎么选型怎么购买服务器 第三章&nbsp;数据生成模块 用户形成数据的一个准备 按照企业的标准,准备了十一张用户行为表 方便使用 第四章&nbsp;采集模块的搭建 购买阿里云服务器 安装 JDK 安装 Flume 第五章&nbsp;用户行为数据仓库 严格按照企业的标准开发 第六章&nbsp;搭建业务数仓理论基础和对表的分类同步 第七章&nbsp;业务数仓的搭建&nbsp; 业务行为数仓效果图&nbsp;&nbsp;
相关文章
|
6月前
|
开发框架 前端开发 JavaScript
ASP.NET Web Pages - 教程
ASP.NET Web Pages 是一种用于创建动态网页的开发模式,采用HTML、CSS、JavaScript 和服务器脚本。本教程聚焦于Web Pages,介绍如何使用Razor语法结合服务器端代码与前端技术,以及利用WebMatrix工具进行开发。适合初学者入门ASP.NET。
|
3月前
|
人工智能 前端开发 Java
DDD四层架构和MVC三层架构的个人理解和学习笔记
领域驱动设计(DDD)是一种以业务为核心的设计方法,与传统MVC架构不同,DDD将业务逻辑拆分为应用层和领域层,更关注业务领域而非数据库设计。其四层架构包括:Interface(接口层)、Application(应用层)、Domain(领域层)和Infrastructure(基础层)。各层职责分明,避免跨层调用,确保业务逻辑清晰。代码实现中,通过DTO、Entity、DO等对象的转换,结合ProtoBuf协议,完成请求与响应的处理流程。为提高复用性,实际项目中可增加Common层存放公共依赖。DDD强调从业务出发设计软件,适应复杂业务场景,是微服务架构的重要设计思想。
|
5月前
|
开发框架 前端开发 .NET
一个适用于 .NET 的开源整洁架构项目模板
一个适用于 .NET 的开源整洁架构项目模板
111 26
|
6月前
|
监控 前端开发 API
一款基于 .NET MVC 框架开发、功能全面的MES系统
一款基于 .NET MVC 框架开发、功能全面的MES系统
150 5
|
7月前
|
敏捷开发 缓存 中间件
.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素
本文深入探讨了.NET技术的高效开发模式,涵盖面向对象编程、良好架构设计及高效代码编写与管理三大关键要素,并通过企业级应用和Web应用开发的实践案例,展示了如何在实际项目中应用这些模式,旨在为开发者提供有益的参考和指导。
81 3
|
9月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
155 7
|
8月前
|
存储 消息中间件 前端开发
.NET常见的几种项目架构模式,你知道几种?
.NET常见的几种项目架构模式,你知道几种?
229 0
|
10月前
|
设计模式 存储 前端开发
揭秘.NET架构设计模式:如何构建坚不可摧的系统?掌握这些,让你的项目无懈可击!
【8月更文挑战第28天】在软件开发中,设计模式是解决常见问题的经典方案,助力构建可维护、可扩展的系统。本文探讨了.NET中三种关键架构设计模式:MVC、依赖注入与仓储模式,并提供了示例代码。MVC通过模型、视图和控制器分离关注点;依赖注入则通过外部管理组件依赖提升复用性和可测性;仓储模式则统一数据访问接口,分离数据逻辑与业务逻辑。掌握这些模式有助于开发者优化系统架构,提升软件质量。
123 5
|
10月前
|
XML 开发框架 .NET
.NET框架:软件开发领域的瑞士军刀,如何让初学者变身代码艺术家——从基础架构到独特优势,一篇不可错过的深度解读。
【8月更文挑战第28天】.NET框架是由微软推出的统一开发平台,支持多种编程语言,简化应用程序的开发与部署。其核心组件包括公共语言运行库(CLR)和类库(FCL)。CLR负责内存管理、线程管理和异常处理等任务,确保代码稳定运行;FCL则提供了丰富的类和接口,涵盖网络、数据访问、安全性等多个领域,提高开发效率。此外,.NET框架还支持跨语言互操作,允许开发者使用C#、VB.NET等语言编写代码并无缝集成。这一框架凭借其强大的功能和广泛的社区支持,已成为软件开发领域的重要工具,适合初学者深入学习以奠定职业生涯基础。
207 1
|
9月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
171 0

热门文章

最新文章