三层架构 示例
三层架构 概念 百度百科: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);
}
其他层的代码 可使用 动软代码生成器 自动生成~

浙公网安备 33010602011771号