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源代码,然后关于三层和反射工厂就会有一个新的认识。

最新文章

  1. 新手学习web遇到的一些乱码问题
  2. Python中文乱码
  3. 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0
  4. Android 插件开发,做成动态加载
  5. win10搭建代理服务器实现绕过校园网的共享限制--从入门到放弃
  6. Check list
  7. 【转】 设定linux 系统可用资源
  8. 递归---NYOJ-90整数划分(一)
  9. new、delete与malloc、free的详解
  10. Java多线程:队列与阻塞队列
  11. node之fs模块
  12. 【interview】Microsoft面经
  13. Flink on yarn的配置及执行
  14. System.ComponentModel.DataAnnotations.Schema.TableAttribute 同时存在于EntityFramework.dll和System.ComponentModel.DataAnnotations.dll中
  15. Codeforces Round #467 (Div. 2) B. Vile Grasshoppers
  16. mongodb之 非正常关闭启动报错处理
  17. PAT甲题题解-1012. The Best Rank (25)-排序水题
  18. SYS_R12 MOAC多组织的四个应用(案例)
  19. magento 12 配置安装教程
  20. 用angular引入复杂的json文件2

热门文章

  1. window搭建svn服务器,本地提交至服务器后,直接同步
  2. vue + element-ui 制作下拉菜单(可配置路由、可根据路由高亮list、可刷新自动展开定位路由)
  3. css笔记 2
  4. 如何在 MSBuild Target(Exec)中报告编译错误和编译警告
  5. 深入理解PHP传参原理(PHP5.2)
  6. c++11 实现RAII特性
  7. BZOJ2662:[BJWC2012]冻结(分层图最短路)
  8. UI到底应该用xib/storyboard完成,还是用手写代码来完成?
  9. iOS8以后UIAlertView和UIActionSheet两种alert页面都将通过UIAlertController来创建
  10. java eclipse 访问 Oracle数据库的代码