本人今儿闲来无事,随便写点东东吧,是设计模式里面关于抽象工厂的应用,其实关于抽象工厂的概念再此我就不多说了,有兴趣的朋友可以去参考各类书籍或是技术文章,里面都有详细的介绍。我现在就注重代码的实现吧,完成一个往不同数据库中添加数据的例子,先声明一点2个数据库之间是可以切换的。下面我就把具体的代码给共享出来。我写此文章的目的在于能帮助初学者学到更多的知识,当然如果是程序开发高手可以完全飘过喔。

  Models层:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Models
{
    public class Stuinfo
    {
        public int stuno { get; set; }
        public string stuname { get; set; }
        public string password { get; set; }
        public int age { get; set; }
        public string sex { get; set; }

        public Stuinfo()
        { }
    }
}

  IDAL层:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Models;

namespace IDAL
{
    public interface IStuinfo
    {
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        List<Stuinfo> findAllStuinfo();

        /// <summary>
        /// 
        /// </summary>
        /// <param name="stuinfo"></param>
        /// <returns></returns>
        int addStuinfo(Stuinfo stuinfo);

        /// <summary>
        /// 有输入参数和输出参数的存储过程
        /// </summary>
        /// <param name="stuinfo"></param>
        /// <returns></returns>
        int addStuinfoTest1(Stuinfo stuinfo);

        /// <summary>
        /// 同时具有返回值、输入参数、输出参数的存储过程
        /// </summary>
        /// <param name="stuinfo"></param>
        /// <returns></returns>
        int addStuinfoTest2(Stuinfo stuinfo);
    }
}

  DAL2005层:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using IDAL;
using Models;

namespace DAL2005
{
    public class StuinfoDAL:IStuinfo
    {
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public List<Stuinfo> findAllStuinfo()
        {
            List<Stuinfo> list = new List<Stuinfo>();
            using(SqlConnection sqlconnection = new SqlConnection(ConfigurationManager.ConnectionStrings["sql2005"].ConnectionString))
            {
                try
                {
                    sqlconnection.Open();
                    SqlCommand sqlcommand = new SqlCommand("Categoriestest1",sqlconnection);
                    sqlcommand.CommandType = CommandType.StoredProcedure;
                    using(SqlDataReader reader = sqlcommand.ExecuteReader(CommandBehavior.CloseConnection))
                    {
                        while(reader.Read())
                        {
                            Stuinfo stuinfo = new Stuinfo()
                            {
                                stuno = (int)reader["stuno"],
                                stuname = reader["stuname"].ToString(),
                                password = reader["password"].ToString(),
                                sex = reader["sex"].ToString(),
                                age = (int)reader["age"]
                            };
                            list.Add(stuinfo);
                        }
                    }
                }
                catch (Exception)
                {
                    
                    throw;
                }
                return list;
            }
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="stuinfo"></param>
        /// <returns></returns>
        public int addStuinfo(Stuinfo stuinfo)
        {
            using(SqlConnection sqlconnection = new SqlConnection(ConfigurationManager.ConnectionStrings["sql2005"].ConnectionString))
            {
                try
                {
                    sqlconnection.Open();
                    SqlCommand sqlcommand = new SqlCommand("Categoriestest3",sqlconnection);
                    sqlcommand.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters = 
                    {
                        new SqlParameter("@stuname",SqlDbType.VarChar,45),
                        new SqlParameter("@password",SqlDbType.VarChar,45),
                        new SqlParameter("@sex",SqlDbType.VarChar,45),
                        new SqlParameter("@age",SqlDbType.Int,4),
                        new SqlParameter("@count",SqlDbType.Int,4)
                    };
                    parameters[0].Value = stuinfo.stuname.ToString();
                    parameters[1].Value = stuinfo.password.ToString();
                    parameters[2].Value = stuinfo.sex.ToString();
                    parameters[3].Value = stuinfo.age;
                    parameters[4].Direction = ParameterDirection.ReturnValue;
                    foreach(SqlParameter parameter in parameters)
                    {
                        sqlcommand.Parameters.Add(parameter);
                    }
                    sqlcommand.ExecuteNonQuery();
                    int count = int.Parse(sqlcommand.Parameters["@count"].Value.ToString());
                    return count;
                }
                catch (Exception)
                {
                    
                    throw;
                }
            }
        }

        /// <summary>
        /// 有输入参数和输出参数的存储过程
        /// </summary>
        /// <param name="stuinfo"></param>
        /// <returns></returns>
        public int addStuinfoTest1(Stuinfo stuinfo)
        {
            using(SqlConnection sqlconnection = new SqlConnection(ConfigurationManager.ConnectionStrings["sql2005"].ConnectionString))
            {
                try
                {
                    sqlconnection.Open();
                    SqlCommand sqlcommand = new SqlCommand("Categoriestest4",sqlconnection);
                    sqlcommand.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters = 
                    {
                        new SqlParameter("@stuno",SqlDbType.Int,4),
                        new SqlParameter("@stuname",SqlDbType.VarChar,45),
                        new SqlParameter("@password",SqlDbType.VarChar,45),
                        new SqlParameter("@sex",SqlDbType.VarChar,45),
                        new SqlParameter("@age",SqlDbType.Int,4)
                    };
                    parameters[0].Direction = ParameterDirection.Output;
                    parameters[1].Value = stuinfo.stuname.ToString();
                    parameters[2].Value = stuinfo.password.ToString();
                    parameters[3].Value = stuinfo.sex.ToString();
                    parameters[4].Value = stuinfo.age;
                    foreach(SqlParameter parameter in parameters)
                    {
                        sqlcommand.Parameters.Add(parameter);
                    }
                    sqlcommand.ExecuteNonQuery();
                    int count = int.Parse(sqlcommand.Parameters["@stuno"].Value.ToString());
                    return count;

                }
                catch (Exception)
                {
                    
                    throw;
                }
            }
        }

        #region IStuinfo 成员

        /// <summary>
        /// 同时具有返回值、输入参数、输出参数的存储过程
        /// </summary>
        /// <param name="stuinfo"></param>
        /// <returns></returns>
        public int addStuinfoTest2(Stuinfo stuinfo)
        {
            using(SqlConnection sqlconnection = new SqlConnection(ConfigurationManager.ConnectionStrings["sql2005"].ConnectionString))
            {
                try
                { 
                    sqlconnection.Open();
                    SqlCommand sqlcommand = new SqlCommand("Categoriestest6",sqlconnection);
                    sqlcommand.CommandType = CommandType.StoredProcedure;
                    SqlParameter[] parameters = 
                    {
                        new SqlParameter("@stuno",SqlDbType.Int,4),
                        new SqlParameter("@stuname",SqlDbType.VarChar,45),
                        new SqlParameter("@password",SqlDbType.VarChar,45),
                        new SqlParameter("@sex",SqlDbType.VarChar,45),
                        new SqlParameter("@age",SqlDbType.Int,4),
                        new SqlParameter("@count",SqlDbType.Int,4)
                    };
                    parameters[0].Direction = ParameterDirection.Output;
                    parameters[1].Value = stuinfo.stuname.ToString();
                    parameters[2].Value = stuinfo.password.ToString();
                    parameters[3].Value = stuinfo.sex.ToString();
                    parameters[4].Value = stuinfo.age;
                    parameters[5].Direction = ParameterDirection.Output;

                    foreach(SqlParameter parameter in parameters)
                    {
                        sqlcommand.Parameters.Add(parameter);
                    }
                    sqlcommand.ExecuteNonQuery();
                    int count = int.Parse(sqlcommand.Parameters["@count"].Value.ToString());//用户名状态(0表示用户名没有注册,1表示用户名已经被注册)
                    if (count == 0)
                    {
                        int newStuno = int.Parse(sqlcommand.Parameters["@stuno"].Value.ToString());
                    }
                    return count;
                }
                catch (Exception)
                {
                    
                    throw;
                }
            }
        }

        #endregion
    }
}

  DALFactory层:

using System;
using System.Collections.Generic;
using System.Configuration;
using System.Linq;
using System.Reflection;
using System.Text;
using IDAL;

namespace DALFactory
{
    public abstract class AbstractorDALFactory
    {
        /// <summary>
        /// switch语句实现抽象工厂
        /// </summary>
        /// <returns></returns>
        public static AbstractorDALFactory chooseFactory()
        {
            string type = ConfigurationManager.AppSettings["type"];
            AbstractorDALFactory factory = null;
            switch (type)
            {
                case "sql2005":
                    {
                        factory = new Sql2005DALFactory();
                        break;
                    }
            }
            return factory;
        }

        /// <summary>
        /// 反射实现抽象工厂
        /// </summary>
        /// <returns></returns>
        public static AbstractorDALFactory reflectionChooseFactory()
        {
            string type = ConfigurationManager.AppSettings["type"].ToString();
            AbstractorDALFactory factory = null;
            factory = (AbstractorDALFactory)Assembly.Load("DALFactory").CreateInstance(type);
            return factory;
        }

        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public abstract IStuinfo createIStuinfo();
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DAL2005;
using IDAL;

namespace DALFactory
{
    public class Sql2005DALFactory:AbstractorDALFactory
    {
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public override IStuinfo createIStuinfo()
        {
            return new StuinfoDAL();
        }
    }
}

  BLLFactory层:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DALFactory;
using IDAL;

namespace BLLFactory
{
    public static class ProxyFactory
    {
        /// <summary>
        /// 
        /// </summary>
        static ProxyFactory()
        {
            AbstractorDALFactory factory = AbstractorDALFactory.reflectionChooseFactory();
            istuinfo = factory.createIStuinfo();
        }

        /// <summary>
        /// 
        /// </summary>
        public static IStuinfo istuinfo { get; set; }
    }
}

  BLL层:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Models;
using BLLFactory;

namespace BLL
{
    public class StuinfoBLL
    {
        /// <summary>
        /// 
        /// </summary>
        /// <returns></returns>
        public static List<Stuinfo> findAllStuinfo()
        {
            return ProxyFactory.istuinfo.findAllStuinfo();
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="stuinfo"></param>
        /// <returns></returns>
        public static int addStuinfo(Stuinfo stuinfo)
        {
            return ProxyFactory.istuinfo.addStuinfo(stuinfo);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="stuinfo"></param>
        /// <returns></returns>
        public static int addStuinfoTest1(Stuinfo stuinfo)
        {
            return ProxyFactory.istuinfo.addStuinfoTest1(stuinfo);
        }

        /// <summary>
        /// 
        /// </summary>
        /// <param name="stuinfo"></param>
        /// <returns></returns>
        public static int addStuinfoTest2(Stuinfo stuinfo)
        {
            return ProxyFactory.istuinfo.addStuinfoTest2(stuinfo);
        }
    }
}

  Web.config:

<appSettings>
		<add key="type" value="DALFactory.Sql2005DALFactory"/>
	</appSettings>
	<connectionStrings>
		<add name="sql2005" connectionString="server=TERRYSHE-3FCE6E\TERRYSHEN;database=master;uid=sa;"/>
    <add name="mysql" connectionString="server=localhost;database=test;uid=root;pwd=123456"/>

  上述代码是抽象工厂中的核心部分,连接的是SQL数据库,如果想换成ORACLE数据库,你们想想代码应该怎么实现。如果有任何的问题,可以随时联系我。感谢大家花时间来看我写的破文章。

  QQ:936944308 沈宇峰

  MSN:yufengshen@msn.cn

作者: 小小峰 发表于 2011-05-11 13:12 原文链接

推荐.NET配套的通用数据层ORM框架:CYQ.Data 通用数据层框架