基于接口编程。

举一个常用的例子,比如程序的数据库访问层能够同时支持,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类,

DAL中实例化EF DBContext数据库上下文对象的时候,根据不同ConnectionStringStorageContainer类:
public string GetWellMeOwnedFlagByGMPI(int? gmpi_id)
        {
            List<byte> byteFlag = new List<byte> { 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:

 /// <summary>
    /// This class contains SwitchDB methods
    /// </summary>
    public class DalSwitchDB
    {
        private static readonly log4net.ILog logger = log4net.LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        private static IConnectionStringStorageContainer _connectionStringStorageContainer;

        /// <summary>
        /// static Constructor of DalSwitchDB
        /// </summary>
        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;
        }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值