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. 实战开发一个Nginx扩展 (Nginx Module)

    repo地址 https://github.com/wujunze/nginx-http-echo-module nginx_module_echo 使用echo指令输出一个字符串 Nginx 版本 ...

  2. centos7下搭建sphinx全文检索引擎

    Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL,PostgreSQL做全文搜索,它可以提供比数据库本身更专业的搜索功能,使得应用 程序更容易实现专业化的全文检索.Sphinx特别为一些 ...

  3. 解析纯真IP地址库

    一周以来,一直在做 IP地址库的解析.从调研到编码到优化,大概花了有七八天的时间.感觉很好玩.总结一下整个做的过程. 1.关于IP 地址库的解析方式 目前主要的解析方式有两种:通过API,或通过IP数 ...

  4. Django Url设计 小知识点

    mysite/news/urls.py: from django.conf.urls import url from . import views urlpatterns = [ url(r'^art ...

  5. CALayer & bitmap Content

    Working with High-Resolution Images Layers do not have any inherent knowledge of the resolution of t ...

  6. luogu P4275 萃香的请柬

    嘟嘟嘟 打表不难发现,序列的长度以及序列中1的个数都是斐波那契数列.因为第 i 秒1的个数由 i - 1的1和 i - 2的0变换而来,那么f[i] = f[i - 1] + f[i - 2].序列的 ...

  7. tomcat快速部署War包操作

    Linux快速部署War包操作,暂时是最简单的操作 1.先关闭Tomcat /home/java/tomcat7/bin/shutdown.sh 2.进入War包存放目录(可以通过工具:SSH Sec ...

  8. javaWeb中怎么获取提交表单里面的值

    在javaWeb中如何获得html文件中的表单里面的值? <!DOCTYPE html> <html> <head> <meta charset=" ...

  9. mobBUS

    1.今天听陈刚说起modBUS通信协议,这个还是第一次听说,究竟是什么东东,还是上网查查看吧 2.网上有C语言程序. http://blog.163.com/li_g888@126/blog/stat ...

  10. oracle表空间的创建+权限分配

    /*分为四步 */ /*第1步:创建临时表空间 */ create temporary tablespace user_temp tempfile 'D:\oracle\oradata\Oracle9 ...