using System;

namespace Demo.Data
{
public class DatabaseProvider
{
private static IDataProvider _instance = null;
private static object lockHelper = new object();

private DatabaseProvider()
{
}

static DatabaseProvider()
{
GetProvider();
}

//创建IDataProvider实例
private static void GetProvider()
{
try
{
var s = Type.GetType("Demo.Data.SqlServer.DataProvider,Demo.Data.SqlServer");
_instance = (IDataProvider)Activator.CreateInstance(Type.GetType(string.Format("Demo.Data.{0}.DataProvider, Demo.Data.{0}", "SqlServer"), false, true));
}
catch (Exception exp)
{
throw new Exception(exp.Message);
}
}

public static IDataProvider Instance()
{
if (_instance == null)
{
lock (lockHelper)
{
if (_instance == null)
{
GetProvider();
}
}
}
return _instance;
}

public static void ResetDbProvider()
{
_instance = null;
}
}
}

using System.Data;
using System.Data.SqlClient;

namespace Demo.Data.SqlServer
{
public partial class DataProvider : IDataProvider
{

//这个类必须实现IDataProvider接口

}
}


百度的解释,还是看不懂啊,还会出错有没有大佬帮我看看的。

生成dll为Music.Data.SqlServer.dll

如果还有其他数据库访问途径,类似方法
建其他的类库
配置文件中写上Access/SqlServer或者其他,
要和你的命名空间保持一致。因为反射时是根据命名空间+类名的方式创建对象的,如代码中的:
Type.GetType(string.Format("Music.Data.{0}.DataProvider,Music.Data.{0}", Configs.GetDbType)
里面的字符串就是你要创建的类的完整名字:
格式为:
Type.GetType("类完整名,程序集名"); 类完整名=命名空间名+类名 下面的方法:
IDataProvider GetInstance()
就是使用单件模式,获取一个IDataProvider
里面使用了锁,防止多线程同时进行时冲突,这里面进行了判断,如果_instance为空就用上面的函数创建一个新的,然后返回。 最后一个方法是释放对象。 有时间去网上搜点反射方面的例子,单件模式应该很容易看懂的,就是用一个静态私有变量,只保持一个实例对象_instance存在。
建议研究一下PetShop源代码,然后关于三层和反射工厂就会有一个新的认识。

创建IDataProvider实例的更多相关文章

  1. EntityFramework Core 1.1是如何创建DbContext实例的呢?

    前言 上一篇我们简单讲述了在EF Core1.1中如何进行迁移,本文我们来讲讲EF Core1.1中那些不为人知的事,细抠细节,从我做起. 显式创建DbContext实例 通过带OnConfiguri ...

  2. 单机静默安装GI软件并创建ASM实例和ASM磁盘组

    环境:RHEL 6.4 + Oracle 11.2.0.4 需求:单机静默安装GI软件并创建ASM实例和ASM磁盘组,为后续迁移数据库文件到ASM做准备 1. 安装配置GI软件 2. 创建ASM实例 ...

  3. 自己动手之使用反射和泛型,动态读取XML创建类实例并赋值

    前言: 最近小匹夫参与的游戏项目到了需要读取数据的阶段了,那么觉得自己业余时间也该实践下数据相关的内容.那么从哪入手呢?因为用的是Unity3d的游戏引擎,思来想去就选择了C#读取XML文件这个小功能 ...

  4. 详解Linux交互式shell脚本中创建对话框实例教程_linux服务器

    本教程我们通过实现来讲讲Linux交互式shell脚本中创建各种各样对话框,对话框在Linux中可以友好的提示操作者,感兴趣的朋友可以参考学习一下. 当你在终端环境下安装新的软件时,你可以经常看到信息 ...

  5. C#创建委托实例

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

  6. 11g 使用rman duplicate复制数据库,创建辅助实例

    一,创建所需目录 1)创建审计文件目录 PROD1@dbrac1 /dsg/oracle11$ cd $ORACLE_BASE/admin PROD1@dbrac1 /u01/app/oracle/a ...

  7. 创建 PDO 实例并在构造函数中设置错误模式

    PDO 将只简单地设置错误码,可使用 PDO::errorCode() 和 PDO::errorInfo() 方法来检查语句和数据库对象.如果错误是由于对语句对象的调用而产生的,那么可以调用那个对象的 ...

  8. SQL Network Interfaces, error: 50 - 发生了 Local Database Runtime 错误。无法创建自动实例。

    今天在用VS2013自带的LocalDB调整数据库时出错,在网上也搜到许多方案,如卸载SQLServer LocalDB的程序.重新创建实例等都没有解决我的问题,也重新修改以及修复Vs,问题依旧存在, ...

  9. Spring工厂方式创建Bean实例

    创建Bean实例的方式: 1) 通过构造器(有参或无参) 方式: <bean id="" class=""/> 2) 通过静态工厂方法 方式: &l ...

随机推荐

  1. easyui学习笔记1—增删改操作

    最近公司要用easyui,这里自己看了官网几篇文章,遇到些问题,大多数的问题都是敲代码的时候笔误,其他有些地方确实需要注意一下,这里做些笔记. 1.在mysql中建好表之后修改id字段为递增字段,发现 ...

  2. 笔记,记事软件(RedbookNote, lifeopraph)

    许多人重视记日记是因为它是一种以天为基础保存个人或商务信息的良好方式:持续跟踪每天的生活和思想上的点点滴滴,组织和巩固记忆.思考.商业交易.电子邮件.账单.未来计划.联系人列表,甚至是秘密信息.Lin ...

  3. 代码大全读书笔记 Part 1

    简单的看了前言,印象最深的还是这本书崇尚"绝不注水"的原则.现实生活中,不仅仅有注水牛肉,瘦肉精的猪肉,很多书籍也是东拼西凑来的内容,不注水的厚书,是十分令人期待的. 第一章:欢迎 ...

  4. PHP验证信用卡卡号函数

    /** * 验证银行卡号是否是信用卡 * @param $cardnumber * @return bool */ function validateCard ($cardnumber) { $car ...

  5. Hive之数据类型

    Hive之数据类型   (本文是基于多篇文章根据个人理解进行的整合,参考的文章见末尾的整理) 数据类型 Hive支持两种数据类型,一类叫原子数据类型,一类叫复杂数据类型.原子数据类型包括数值型.布尔型 ...

  6. 决策树在sklearn中的实现

    1 概述 1.1 决策树是如何工作的 1.2 构建决策树 1.2.1 ID3算法构建决策树 1.2.2 简单实例 1.2.3 ID3的局限性 1.3 C4.5算法 & CART算法 1.3.1 ...

  7. 【noip模拟赛 sword,zero,2048】 题解

    1.光剑 (sword.pas/c/cpp) [题目描述] 小林和亮亮各有一把光剑,长度分别为 a 和 b,他们拿光剑进行比试.每一回合,长光剑会砍向短光剑,砍完后,短光剑完好无损,而长光剑则被截成两 ...

  8. HDU 2717 Catch That Cow(常规bfs)

    传送门:http://acm.hdu.edu.cn/showproblem.php?pid=2717 Catch That Cow Time Limit: 5000/2000 MS (Java/Oth ...

  9. win764 ping不能用的问题

    1.某日发现,ping突然用不了了 2.百度一搜,有如下解答: 1.右击计算机点属性之后找到系统属性下的环境变量: 2.找到系统变量的"path"之后按“编辑”: 3.变量值前面的 ...

  10. Extjs header column 自定义排序规则

    Extjs 的表格自带排序功能,这个功能在大部分情况下能够满足我们的需求,但是在某种情况下,例如IP排序,默认情况下,按照字符串进行排序, 此时我们需要自定义排序规则,这个时候就需要我们重写方法了, ...