三层架构 示例

三层架构 概念 百度百科:http://baike.baidu.com/view/687468.htm

工厂模型三层:

项目层添加 数据库连接信息  App.config 文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <appSettings>
    <!--数据访问层-->
    <add key="DAL" value="DBAccess.SQLServerDAL" />
    <!--连接字符串是否加密-->
    <add key="IsCnnStrEncrypted" value="false"/>
  </appSettings>

  <connectionStrings>
    <add name="DB1" connectionString="Persist Security Info=False;server=.;database=centerobj-yf;User ID=sa;password=12345678;Packet Size=4096;Pooling=true;Max Pool Size=100;Min Pool Size=1" />
    <add name="DB2" connectionString="Persist Security Info=False;server=.;database=noteobj-yf;User ID=sa;password=12345678;Packet Size=4096;Pooling=true;Max Pool Size=100;Min Pool Size=1" />
  </connectionStrings>
</configuration>

 

DALFactory 层代码如下:

using System;
using System.Reflection;
using System.Configuration;
using System.Globalization;
using System.Text;

namespace DBAccess.DALFactory
{
    /// <summary>
    /// Abstract Factory pattern to create the DAL。
    /// 如果在这里创建对象报错,请检查web.config里是否修改了<add key="DAL" value="Maticsoft.SQLServerDAL" />。
    /// </summary>
    public sealed class DataAccess
    {
        public enum DBType { SQLServer, MySQL };

        #region Field
        private static readonly string SQLServerAssemblyPath = "DBAccess.SQLServerDAL";
        private static readonly string MySQLAssemblyPath = "DBAccess.MySQLDAL";

        private static readonly string SQLServerFormat = "Persist Security Info=False;server={0};database={1};User ID={2};password={3};Packet Size=4096;Pooling=true;Max Pool Size=100;Min Pool Size=1";
        private static readonly string MySQLFormat = "Data Source={0};Database={1};User Id={2};Password={3};CharSet=gb2312";

        private static string m_DAL = null;
        private static string m_Center = null;
        private static string m_Note = null;

        private static Configuration m_Config;
        #endregion

        /// <summary>
        /// 获取ConnectionString的配置
        /// </summary>
        /// <param name="key">The key.</param>
        /// <returns></returns>
        private static string GetConnectionString(string key)
        {
            bool isCnnStrEncrypted = m_Config == null
                    ? (ConfigurationManager.AppSettings["IsCnnStrEncrypted"].ToLower() == "true")
                    : (m_Config.AppSettings.Settings["IsCnnStrEncrypted"].Value.ToString().ToLower() == "true");
            string cnnStr = m_Config == null
                    ? ConfigurationManager.ConnectionStrings[key].ConnectionString
                    : m_Config.ConnectionStrings.ConnectionStrings[key].ConnectionString;

            if (!isCnnStrEncrypted)
                return cnnStr;
            else
            {
                byte[] outputBytes = Convert.FromBase64String(cnnStr);
                cnnStr = Encoding.Default.GetString(outputBytes);
                return cnnStr;
            }
        }

        private static string GetAppSettings(string key)
        {
            return m_Config == null
                       ? ConfigurationManager.AppSettings[key]
                       : m_Config.AppSettings.Settings[key].Value;
        }

        /// <summary>
        /// 默认的DAL程序集
        /// </summary>
        public static string DAL
        {
            get
            {
                return string.IsNullOrEmpty(m_DAL) ? GetAppSettings("DAL") : m_DAL;
            }
            set { m_DAL = value; }
        }
        /// <summary>
        /// 默认的Center数据库连接字符串
        /// </summary>
        public static string Center
        {
            get
            {
                return string.IsNullOrEmpty(m_Center)
                    ? GetConnectionString("DB1")
                    : m_Center;
            }
            set { m_Center = value; }
        }
        /// <summary>
        /// 默认的Note数据库连接字符串
        /// </summary>
        public static string Note
        {
            get
            {
                return string.IsNullOrEmpty(m_Note)
                    ? GetConnectionString("DB2")
                    : m_Note;
            }
            set { m_Note = value; }
        }

        #region Method

        /// <summary>
        /// 设置配置文件的路径,没有设置,则使用默认的配置文件
        /// </summary>
        /// <param name="path">The path.</param>
        public static void SetConfigurationPath(string path)
        {
            var map = new ExeConfigurationFileMap { ExeConfigFilename = path };
            m_Config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
        }

        /// <summary>
        /// 是否启用备份的数据库
        /// </summary>
        /// <param name="enable">if set to <c>true</c> [enable].</param>
        public static void UseBackupNote(bool enable)
        {
            Note = enable
                       ? GetConnectionString("BackupNote")
                       : GetConnectionString("Note");
        }

        /// <summary>
        /// 改变数据库连接字符串
        /// </summary>
        /// <param name="center">center数据库连接字符串</param>
        /// <param name="note">note数据库连接字符串</param>
        public static void ChangeConnections(string center, string note)
        {
            Center = center;
            Note = note;
        }

        /// <summary>
        /// 从Center数据库中创建默认的DAL实例
        /// </summary>
        /// <returns>DAL实例</returns>
        public static T CreateInstanceOfCenter<T>()
        {
            return DataAccess.CreateInstance<T>(DAL, Center);
        }

        /// <summary>
        /// 从Note数据库中创建默认的DAL实例
        /// </summary>
        /// <returns>DAL实例</returns>
        public static T CreateInstanceOfNote<T>()
        {
            return DataAccess.CreateInstance<T>(DAL, Note);
        }

        /// <summary>
        /// 创建DAL实例
        /// </summary>
        /// <param name="type">数据库类型</param>
        /// <param name="dbServer">数据库服务器</param>
        /// <param name="dbName">数据库名称</param>
        /// <param name="user">用户名</param>
        /// <param name="password">密码</param>
        /// <returns>DAL实例</returns>
        public static T CreateInstance<T>(DBType type, string dbServer, string dbName, string user, string password)
        {
            string dal = (type == DBType.MySQL) ? MySQLAssemblyPath : SQLServerAssemblyPath;
            string connection = (type == DBType.MySQL) ? string.Format(MySQLFormat, dbServer, dbName, user, password) : string.Format(SQLServerFormat, dbServer, dbName, user, password);
            return DataAccess.CreateInstance<T>(dal, connection);
        }

        /// <summary>
        /// 创建DAL实例
        /// </summary>
        /// <param name="dal">dal名称</param>
        /// <param name="connection">数据库连接字符串</param>
        /// <returns>DAL实例</returns>
        private static T CreateInstance<T>(string dal, string connection)
        {
            string classNamespace = dal + "." + typeof(T).Name.Substring(1);
            object[] args = new object[] { connection };
            Assembly assembly = Assembly.Load(dal);
            object obj = assembly.CreateInstance(classNamespace, false, BindingFlags.Default, null, args, CultureInfo.CurrentCulture, null);
            return (T)obj;
        }
        #endregion
    }
}

 

 

Bll层 通过DALFactory层 去访问数据库

 

示例代码如下:

 

        private Iemployee dal = null;

        public employee()
        {
            dal = DataAccess.CreateInstanceOfCenter<Iemployee>();
        }

        public employee(DataAccess.DBType type, string dbServer, string dbName, string user, string password)
        {
            dal = DataAccess.CreateInstance<Iemployee>(type, dbServer, dbName, user, password);
        }
        #region  成员方法
        /// <summary>
        /// 是否存在该记录
        /// </summary>
        public bool Exists(string Id)
        {
            return dal.Exists(Id);
        }

 

 

其他层的代码  可使用 动软代码生成器 自动生成~

posted @   三叶草╮  阅读(125)  评论(0编辑  收藏  举报
(评论功能已被禁用)
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示