创建IDataProvider实例
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源代码,然后关于三层和反射工厂就会有一个新的认识。
最新文章
- 新手学习web遇到的一些乱码问题
- Python中文乱码
- 基于Qt5.5.0的sql数据库、SDK_tts文本语音朗读的CET四六级单词背诵系统软件的编写V1.0
- Android 插件开发,做成动态加载
- win10搭建代理服务器实现绕过校园网的共享限制--从入门到放弃
- Check list
- 【转】 设定linux 系统可用资源
- 递归---NYOJ-90整数划分(一)
- new、delete与malloc、free的详解
- Java多线程:队列与阻塞队列
- node之fs模块
- 【interview】Microsoft面经
- Flink on yarn的配置及执行
- System.ComponentModel.DataAnnotations.Schema.TableAttribute 同时存在于EntityFramework.dll和System.ComponentModel.DataAnnotations.dll中
- Codeforces Round #467 (Div. 2) B. Vile Grasshoppers
- mongodb之 非正常关闭启动报错处理
- PAT甲题题解-1012. The Best Rank (25)-排序水题
- SYS_R12 MOAC多组织的四个应用(案例)
- magento 12 配置安装教程
- 用angular引入复杂的json文件2
热门文章
- window搭建svn服务器,本地提交至服务器后,直接同步
- vue + element-ui 制作下拉菜单(可配置路由、可根据路由高亮list、可刷新自动展开定位路由)
- css笔记 2
- 如何在 MSBuild Target(Exec)中报告编译错误和编译警告
- 深入理解PHP传参原理(PHP5.2)
- c++11 实现RAII特性
- BZOJ2662:[BJWC2012]冻结(分层图最短路)
- UI到底应该用xib/storyboard完成,还是用手写代码来完成?
- iOS8以后UIAlertView和UIActionSheet两种alert页面都将通过UIAlertController来创建
- java eclipse 访问 Oracle数据库的代码