ASP.NET三层结构演化构建之五——啥都能用

如果用户有一天要使用多种数据库或者是更改原先的数据库种类,那我们原来的三层结构就抗不住啦。

 

所以在完成项目的时候,要添加多数据库支持。

 

在这里先给大家介绍俩概念。

 

第一个是简单工厂模式。

简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类(这些产品类继承自一个父类或接口)的实例。

简单工厂模式中包含三个角色:

工厂(Creator)角色

简单工厂模式的核心,它负责实现创建所有实例的内部逻辑。工厂类可以被外界直接调用,创建所需的产品对象。

抽象(Product)角色

简单工厂模式所创建的所有对象的父类,它负责描述所有实例所共有的公共接口。

具体产品(Concrete Product)角色

是简单工厂模式的创建目标,所有创建的对象都是充当这个角色的某个具体类的实例。

一般来讲它是抽象产品类的子类,实现了抽象产品类中定义的所有接口方法。

 

第二个是.NET中的反射。

程序集包含模块,而模块包含类型,类型又包含成员。 反射则提供了封装程序集、模块和类型的对象。 您可以使用反射动态地创建类型的实例,将类型绑定到现有对象,或从现有对象中获取类型。 然后,可以调用类型的方法或访问其字段和属性。

上面的那一堆理解起来有点困难的话,我给解释一下。我的项目中用到的反射的功能就是根据需要对程序集进行加载。

 

现在开始实施。

 

首先是建立数据库访问的接口类,存放在IDAL层中。只要继承于IDAL中的接口,就可以实现数据访问。

 

建立一个类库项目IDAL,添加IUser.cs

IDALIUser中的I就是接口(Interface)的意思啦。这个是简单工厂中的抽象角色。

在数据访问接口类中也要添加对Model的引用。

 

IUser.cs的内容如下:

 

using Model;

 

namespace IDAL

{

    public interface IUser

    {

        /// <summary>

        /// 根据用户Id获取用户信息

        /// </summary>

        /// <param name="userId">用户Id</param>

        /// <returns>用户信息</returns>

        UserInfo GetUserInfo(string userId);

    }

}

 

接下来就是写子类继承于IDAL中的接口了。

 

原先有一个项目,叫DAL,是使用SQL Server的。现在添加了多数据库支持,我们将原来的DAL改成SQLServerDAL

 

注意。要将命名空间也改成SQLServerDAL

 

右击SQLServerDAL项目,选择属性,如图:

 

将程序集名称和默认命名空间由原先的DAL更改为SQLServerDAL,并对项目添加IDAL的引用。

 

User类应该实现IUser接口。所以User.cs的内容如下:

 

using System.Data;

using System.Data.SqlClient;

using DBUtility;

using IDAL;

using Model;

 

namespace SQLServerDAL

{

    public class User : IUser

    {

        private const string SQL_SELECT_USERINFO_BY_USERID = "SELECT * FROM [User] WHERE UserId = @UserId";

        private const string PARM_USERID = "@UserId";

 

        /// <summary>

        /// 根据用户Id获取用户信息

        /// </summary>

        /// <param name="userId">用户Id</param>

        /// <returns>用户信息</returns>

        public UserInfo GetUserInfo(string userId)

        {

            UserInfo user = null;

            SqlParameter parm = new SqlParameter(PARM_USERID, SqlDbType.VarChar, 10);//参数UserId

            parm.Value = userId;//给参数赋值

            using (SqlDataReader rdr = SqlHelper.ExecuteReader(SqlHelper.ConnectionStringLocalTransaction, CommandType.Text, SQL_SELECT_USERINFO_BY_USERID, parm))

            {

                if (rdr.Read())

                {

                    user = new UserInfo(rdr.GetInt32(0), rdr.GetString(1), rdr.GetBoolean(2), rdr.GetString(3), rdr.GetBoolean(4), rdr.GetInt16(5));

                }

                else user = new UserInfo();

            }

            return user;

        }

    }

}

 

接下来是创建简单工厂中的工厂角色了。我们这里的工厂是要生产符合我们要求的DAL层。根据web.config中的配置,创建想要的DAL,如SQLServerDAL,AccessDAL等。

 

打开web.config,找到<appSettings />,将其修改为:

 

<appSettings>

    <add key="DAL" value="SQLServerDAL"/>

  </appSettings>

 

这样就创建了一个配置项,名称为DAL,值为SQLServerDAL,表示目前使用的DALSQLServerDAL。用户可以根据自己的需求更改value的值。当然,前提是项目中实现了相应的DAL。我们这里先设置为SQLServerDAL

 

工厂角色要新建一个层。新建类库项目,命名为: DALFactory,然后新建一个密封类DataAccess作为生成相应继承于IDAL的类。并对DALFactory添加对IDAL的引用。

 

DataAccess.cs的具体内容如下:

 

using System.Configuration;

using System.Reflection;

using IDAL;

 

namespace DALFactory

{

    public sealed class DataAccess

    {

        private static readonly string path = ConfigurationManager.AppSettings["DAL"];//获取web.config中的配置,得到所需的IDAL的具体实现

 

        private DataAccess() { }

 

        public static IUser CreateUser()

        {

            string className = path + ".User";//具体的类名

            return (IUser)Assembly.Load(path).CreateInstance(className);//加载相应的程序集,创建实例并转换为相应的接口类型

        }

    }

}

 

BLL添加对IDAL的引用。这样我们就可以在BLL中调用DALFactory中相应的Create方法来创建DAL示例。BLL中的User.cs如下:

 

using IDAL;

using DALFactory;

 

namespace BLL

{

    public class User

    {

        private static readonly IUser dal = DataAccess.CreateUser();

 

        /// <summary>

        /// 根据用户Id获取用户密码

        /// </summary>

        /// <param name="userId">用户Id</param>

        /// <returns>用户密码</returns>

        public string GetUserPassword(string userId)

        {

            return dal.GetUserInfo(userId).Password;

        }

 

        /// <summary>

        /// 根据用户Id获取用户姓名

        /// </summary>

        /// <param name="userId">用户Id</param>

        /// <returns>用户姓名</returns>

        public string GetUserName(string userId)

        {

            return dal.GetUserInfo(userId).UserName;

        }

    }

}

 

这样就完成了通过简单工厂模式对多数据库的支持。为了更好地说明实现的原理,我提供的源代码中还提供了Access数据库以及对Access数据库的支持类AccessDAL。同志们可以研究一下。

 

总结一下多数据库支持的实现流程吧。

1. 在数据库配置文件中添加配置属性,用于存放DAL类型配置。

2. 创建简单工厂模式中的抽象角色,即创建IDAL层,对DAL的实现进行规范

3. 创建简单工厂模式中的产品角色,即创建继承于IDAL层中的接口的类。这里的类是不同数据库对IDAL中接口的具体实现。

4. 创建简单工厂模式中的工厂角色,即创建DALFactory层,用于产生所需的DAL

5. BLL中调用DALFactory中相应的方法,创建所需的DAL实例。

 

嘿嘿。

 

项目示例下载:http://download.csdn.net/source/2946951 

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