举一个常用的例子,比如程序的数据库访问层能够同时支持,SQLServer, Oracle等多种数据库。这样,在实例化ADO.net对象和具体操作时候,就要走不同的分支。一个是SQL Server的,一个是Oracle的。 这时候,就需要不同的条件(可以是后台设置的使用SQL or Oracle or ...),实例化不同数据库访问类的对象。
//接口默认public,加上public修饰符也不报错
interface IUserService
{
//接口方法不能有访问修饰符,否则报错
string GetUserName();
bool IsExists();
}
public class SQLUserService:IUserService
{
//实现接口的方法必须是 public 的
public string GetUserName()
{
return "SQLServer return username: SQL";
}
public bool IsExists()
{
return true;
}
}
public class OracleUserService : IUserService
{
//实现接口的方法必须是 public 的
public string GetUserName()
{
return "Oracle return username: Oracle";
}
public bool IsExists()
{
return true;
}
}
IUserService userBLL = null;
//根据不同条件,给接口实现不同的类的实例。
if (Request.Form["DB"] != null && Request.Form["DB"].ToString() == "SQL")
{
userBLL = new SQLUserService();
}
else
{
userBLL = new OracleUserService();
}
string name = userBLL.GetUserName();
我们Service端的连接字符串保存到Application对象中,但是Test项目是一个类库项目,不是Web Application,获取不到System.Web.HttpContext.Current下的东西,这时候,解决方案是扩展一下获取连接字符串的方法,WEB application还是从application对象取,但是如果是类库项目,从System.Collections.Hashtable中设值和取值。
IConnectionStringStorageContainer接口:
public interface IConnectionStringStorageContainer
{
string GetConnectionString(string key);
void Store(string key, string connectionString);
void Clear();
}
包含3个方法。获取连接字符串,设值连接字符串,清除。要实现的是,根据不同环境, 从application/Hashtable 对象 获取/设值连接字符串
具体实现类HashtableConnectionStringStorageContainer,用于类库项目:
public class HashtableConnectionStringStorageContainer: IConnectionStringStorageContainer
{
private static readonly Hashtable _connectionStrings = new Hashtable();
public string GetConnectionString(string key)
{
string connectionString = string.Empty;
if (_connectionStrings.Contains(key))
connectionString = _connectionStrings[key].ToString();
return connectionString;
}
public void Store(string key, string connectionString)
{
if (_connectionStrings.Contains(key))
_connectionStrings[key] = connectionString;
else
_connectionStrings.Add(key, connectionString);
}
public void Clear()
{
_connectionStrings.Clear();
}
}
具体实现类HttpConnectionStringStorageContainer,用于Web Application:
public class HttpConnectionStringStorageContainer : IConnectionStringStorageContainer
{
public string GetConnectionString(string key)
{
string connectionString = string.Empty;
if (System.Web.HttpContext.Current.Application.AllKeys.Contains(key))
connectionString = System.Web.HttpContext.Current.Application[key].ToString();
return connectionString;
}
public void Store(string key, string connectionString)
{
if (System.Web.HttpContext.Current.Application.AllKeys.Contains(key))
System.Web.HttpContext.Current.Application[key] = connectionString;
else
System.Web.HttpContext.Current.Application.Add(key, connectionString);
}
public void Clear()
{
throw new NotImplementedException();
}
}
调用的地方,根据条件不同,给接口实例化不同的类的对象,这里写在一个单独的类中:
public class ConnectionStringStorageFactory
{
public static IConnectionStringStorageContainer _connectionStringStorageContainer;
public static IConnectionStringStorageContainer CreateStorageContainer()
{
if (_connectionStringStorageContainer == null)
{
if (System.Web.HttpContext.Current == null)
_connectionStringStorageContainer = new HashtableConnectionStringStorageContainer();
else
_connectionStringStorageContainer = new HttpConnectionStringStorageContainer();
}
return _connectionStringStorageContainer;
}
}
这样,当WEB项目调用的时候,实例化的是HttpConnectionStringStorageContainer类,
public string GetWellMeOwnedFlagByGMPI(int? gmpi_id)
{
List byteFlag = new List { 1 };
using (var edw_ato = DalSwitchDB.GetEDWAtomicContext())
{
var query = (from a in edw_ato.HIER_MEMBER_OPER.AsNoTracking()
join c in edw_ato.CENTER_LKP.AsNoTracking()
on a.Clinic_Code equals c.Center_Code
where a.GMPI_Id == gmpi_id && byteFlag.Contains(a.Current_Enrollment_Flag.Value)
select c.Center_Wellmed_Owned_Flag).Distinct();
if (query.Any(p => p == "Y"))
{
return "Y";
}
return "N";
}
}
DalSwitchDB:
///
/// This class contains SwitchDB methods
///
public class DalSwitchDB
{
private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
private static IConnectionStringStorageContainer _connectionStringStorageContainer;
///
/// static Constructor of DalSwitchDB
///
static DalSwitchDB()
{
_connectionStringStorageContainer = ConnectionStringStorageFactory.CreateStorageContainer();
}
public static EDW_AtomicEntities GetEDWAtomicContext()
{
logger.Info("ENTER " + System.Reflection.MethodBase.GetCurrentMethod().Name + DateTime.Now.ToString());
string EDW_Atomic_cn = _connectionStringStorageContainer.GetConnectionString("DW02Atomic");
EDW_AtomicEntities e_EDW_Atomic = new EDW_AtomicEntities(EDW_Atomic_cn);
e_EDW_Atomic.Configuration.AutoDetectChangesEnabled = false;
logger.Debug("Underlying EDW_Atomic SQL Connection String = " + EDW_Atomic_cn);
logger.Info("EXIT " + System.Reflection.MethodBase.GetCurrentMethod().Name + DateTime.Now.ToString());
return e_EDW_Atomic;
}