为何使用N层架构?

因为每一层都可以:在仅仅更改很少量的代码后就能放到不同的服务器上使用,因此结构灵活而且性能更佳。此外,每层做些什么其它层是完全看不到的,因此更改、更新某层,都不再需要重新编译或者更改全部的层了。这是个很强大的功能。例如,如果把数据访问代码与业务逻辑层分离,当数据库服务器更改后,你只需要更改数据访问的代码,因为业务逻辑层是不变的,因此不需要更改或者重新编译业务逻辑层。

一个N层的应用程序通常有三层:表现层业务层数据层。下面让我们看看每层都做些什么。

表现层(Presentation Layer)

表现层用于用户接口的展示,以及用业务层的类和对象来“驱动”这些接口。

在ASP.NET中,该层包括aspx页面、用户控制、服务器控制以及某些与安全相关的类和对象。

业务层(Business Tier)

业务层用于访问数据层,从数据层取数据、修改数据以及删除数据,并将结果返回给表现层。

在ASP.NET中,该层包括使用SqlClient或OleDb从SQL Server或Access数据库取数据、更新数据及删除数据,并把取得的数据放到DataReader或DataSet中返回给表现层。返回的数据也许只有一个整型数字,比如一个表的行记录数目,但这也要用数据层的数据进行计算。



BLL和DAL

通常该层被划分成两个子层:业务逻辑层(Business Logic Layer,BLL)和数据访问层(Data Access Layers,DAL)。业务逻辑层在数据访问层之上,也就是说BLL调用DAL的类和对象。DAL访问数据并将其转给BLL。

在ASP.NET中,该层可以用SqlClient或OleDb从SQL Server或Access数据库取数据,把数据通过DataSet 或DataReader的形式给BLL,BLL处理数据给表现层。有的时候,例如直接把DataSet 或DataReader送给表现层的时候,BLL是一个透明层。

数据层(Data Tier)

数据层是数据库或者数据源。在.NET中,通常它是一个SQL Server或Access数据库,但不仅限于此两种形式,它还可能是Oracle,mySQL,甚至是XML。

逻辑层VS(分布式)物理层

人们容易将这两个概念搞混。我们说逻辑层是把层按类的集合来划分,而这些层都在同一台个服务器上。(分布式)物理层是指类的集合在不同的服务器上,用附加的代码来处理层间的通信,比如remoting和web服务。

决定如何划分你的层(是物理的还是不是物理的)是非常重要的。在划分时应考虑下面因素:

1、注意如果划分成物理层,你的应用程序的速度会因为不同服务器在网络中通信的延迟而减慢。所以,如果你决定用物理层,请确保获得性能的提升大于性能的降低。

2、按照n层架构设计你的应用程序。

3、部署以及维护物理分布式的应用程序的成本是很高的。你首先需要不止一台服务器,你还需要网络硬件来连接这些服务器。在这种情况下,部署应用变得更加复杂!因此这样做之前请确定这样做是否值得。

另外还要注意,你的应用程序的每层都做何使用。你也许因为运行的多个服务都需要某一层而把该层放到别台服务器上。例如,你也许会因为给不同的用户定制不同的表现层,而将业务逻辑层放于别处;你也许会因为还有其它的应用访问同一个数据库,而把SQL server服务放到别处。

c  三层架构 视频教程 三层架构实例_数据库

模型层

private int userId;

        public int UserId
        {
            get { return userId; }
            set { userId = value; }
        }
        private string userName;

        public string UserName
        {
            get { return userName; }
            set { userName = value; }
        }
        private string passWord;

        public string PassWord
        {
            get { return passWord; }
            set { passWord = value; }
        }
数据层
public class UserService
    {
        public List<User> GetAllUserDynamic(string whereCondition)
        {
            List<User> users=new List<User>();
            string strSQL = "spSelect";
            SqlParameter[] parameter = new SqlParameter[] 
            {
                new SqlParameter("@TableCondition","User"),
                new SqlParameter("@WhereCondition",whereCondition),
                new SqlParameter("@OrderCondition",null)
            };
            using (SqlDataReader dataReader=SqlHelper.GetDataReader(strSQL,parameter))
            {
                while (dataReader.Read())
                {
                    User user = new User();
                    user.UserId = (int)dataReader["UserId"];
                    user.UserName = dataReader["UserName"].ToString();
                    user.PassWord = dataReader["PassWord"].ToString();
                   // user.TypeId = (int)dataReader["TypeId"];
                    users.Add(user);
                }
            }
            return users;
        }
        public object AddUser(User user) 
        {
            string strSQL = "spInsert";
            string valueCondition = string.Format("'{0}','{1}',{2}",user.UserName,user.PassWord,user.TypeId);
            SqlParameter[] parameter = new SqlParameter[] 
            {
                new SqlParameter("@TableCondition","User"),
                new SqlParameter("@ValueCondition",valueCondition)
            };
            return SqlHelper.ExecuteSalar(strSQL, parameter);
        }
        public int UpdateUser(User user)
        {
            string strSQL = "spUpdate";
            string setCondition = string.Format("[UserName]='{0}',[PassWord]='{1}',[TypeId]={2}", user.UserName, user.PassWord, user.TypeId);
            string whereCondition = string.Format("[UserId]={0}",user.UserId);
            SqlParameter[] parameter = new SqlParameter[] 
            {
                new SqlParameter("@TableCondition","User"),
                new SqlParameter("@SetCondition",setCondition),
                new SqlParameter("@WhereCondition",whereCondition)
            };
            return SqlHelper.ExecuteCommand(strSQL, parameter);
        }
        public int DeleteUser(User user)
        {
            string strSQL = "spDelete";
            string whereCondition = string.Format("[UserId]={0}", user.UserId);
            SqlParameter[] parameter = new SqlParameter[] 
            {
                new SqlParameter("@TableCondition","User"),
                new SqlParameter("@WhereCondition",whereCondition)
            };
            return SqlHelper.ExecuteCommand(strSQL, parameter);
        }
    }


业务层
public class UserManager
    {
        UserService userService=new UserService();
        [DataObjectMethod(DataObjectMethodType.Select)]
        public List<User> GetAllUser() 
        {
            return userService.GetAllUserDynamic(null);
        }
        [DataObjectMethod(DataObjectMethodType.Select)]
        public User GetAllUserByUserId(int userId) 
        {
            string whereCondition = string.Format("[UserId]={0}",userId);
           List<User> users = userService.GetAllUserDynamic(whereCondition);
           return users.Count > 0 ? users[0] : null;
        }
        [DataObjectMethod(DataObjectMethodType.Insert)]
        public object AddUser(User user) 
        {
            return userService.AddUser(user);
        }
        [DataObjectMethod(DataObjectMethodType.Update)]
        public int UpdateUser(User user)
        {
            return userService.UpdateUser(user);
        }
        [DataObjectMethod(DataObjectMethodType.Delete)]
        public int DeleteUser(User user)
        {
            return userService.DeleteUser(user);
        }
        [DataObjectMethod(DataObjectMethodType.Select)]
        public User LoginUser(object userName,object passWord) 
        {
            string whereCondition = string.Format("[UserName]='{0}'AND [PassWord]='{1}'",userName,passWord);
            List<User> users = userService.GetAllUserDynamic(whereCondition);
            return users.Count > 0 ? users[0] : null;
        }
    }


表示层 随便拖个拖个gridview 绑定下数据源

我用的通用存储过程

CREATE PROCEDURE dbo.spSelect
(
@TableCondition nvarchar(255),
@WhereCondition nvarchar(255)=null,
@OrderCondition nvarchar(255)=null
)
AS
DECLARE @SQL NVARCHAR(255)
SET @SQL='SELECT * FROM['+@TableCondition+']'
IF @WhereCondition IS NOT NULL AND LEN (@WhereCondition)>0
BEGIN 
SET @SQL=@SQL+'WHERE'+@WhereCondition
END
IF @OrderCondition IS NOT NULL AND LEN (@OrderCondition)>0
BEGIN 
SET @SQL=@SQL+'ORDER BY'+@OrderCondition
END
EXEC sp_executesql @SQL
RETURN

GO
CREATE PROCEDURE dbo.spInsert
(
@TableCondition nvarchar(255),
@ValueCondition nvarchar(255)=null
)
AS
DECLARE @SQL NVARCHAR(255)
SET @SQL='INSERT INTO['+@TableCondition+']'
IF @ValueCondition IS NOT NULL AND LEN (@ValueCondition)>0
BEGIN 
SET @SQL=@SQL+'VALUES('+@ValueCondition+')'
END
SET @SQL=@SQL+'SELECT SCOPE_IDENTITY()'
EXEC sp_executesql @sql
RETURN
GO

CREATE PROCEDURE dbo.spUpdate
(
@TableCondition nvarchar(255),
@SetCondition nvarchar(255)=null,
@WhereCondition nvarchar(255)=null
)
AS
DECLARE @SQL NVARCHAR(255)
SET @SQL='UPDATE ['+@TableCondition+']'
IF @SetCondition IS NOT NULL AND LEN (@SetCondition)>0
BEGIN 
SET @SQL=@SQL+'SET'+@SetCondition
END
IF @WhereCondition IS NOT NULL AND LEN (@WhereCondition)>0
BEGIN 
SET @SQL=@SQL+'WHERE'+@WhereCondition
END
EXEC sp_executesql @sql
RETURN
GO
CREATE PROCEDURE dbo.spDelete
(
@TableCondition nvarchar(255),
@WhereCondition nvarchar(255)=null
)
AS
DECLARE @SQL NVARCHAR(255)
SET @SQL='DELETE FROM ['+@TableCondition+']'
IF @WhereCondition IS NOT NULL AND LEN (@WhereCondition)>0
BEGIN 
SET @SQL=@SQL+'WHERE'+@WhereCondition
END
EXEC sp_executesql @sql
RETURN