数据层扩展包EFCachingProvider 总结

简介:

 

总体描述

    关于EFCachingProvider是什么及如何使用它,请看园子的这篇文章:《 Entity Framework 缓存处理与日志监控 》。我主要说一下内部代码实现的原理机制。

    园子文章的图中,画出了EFCachingProvider所扩展的位置:

EfProviderWrapper

    也就是说,EntityConnection不是直接使用SqlClient中间的SQLConnection,而是通过EFCachingProvider把命令转换后,再使用SqlClient执行。


解决方案结构

image

    重点工程解释: 
EFProviderWrapperToolkit:定义了扩展SqlClient的框架,其中包括:DbConnectionWrapper、DbCommandWrapper等。
EFCachingProvider:以Caching的方式实现了SqlClient的扩展,包括:DbCachingConnection、DbCachingCommand等。
EFTracingProvider:在SqlClient的基础上扩展了日志监控的功能。


 

具体如何扩展

    EFCachingProvider虽从命名上看,是EntityFramework的缓存扩展包。但它其实是在System.Data.Common上直接进行扩展。也就是说,只要与数据库打交道的应用程序,都可以使用这个扩展包。(可能需要少量修改。)

    它使用装饰模式和抽象工厂,直接继承了以下ADO.NET核心对象:DbConnection、DbCommand、DbCommandDefinition、DbProviderFactoryBase、DbProviderServicesBase,并命名为***Wrapper。以下为DbConnection的扩展:

image

而装饰的具体代码在静态方法DbConnectionWrapper.WrapConnection中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/// <summary>
/// Wraps the connection.
/// </summary>
/// <param name="connection">The connection.</param>
/// <param name="wrapperProviderInvariantNames">The wrapper provider invariant names.</param>
/// <returns>Wrapped connection.</returns>
internal  static  DbConnection WrapConnection(DbConnection connection, params  string [] wrapperProviderInvariantNames)
{
     foreach  ( string  invariantName in  wrapperProviderInvariantNames)
     {
         DbProviderFactory factory = DbProviderFactories.GetFactory(invariantName);
         var  connectionWrapper = factory.CreateConnection();
         DbConnectionWrapper wrapper = (DbConnectionWrapper)connectionWrapper;
         wrapper.WrappedConnection = connection;
         connection = connectionWrapper;
     }
 
     return  connection;
}

使用方法:

1
2
3
4
DbConnectionWrapper.WrapConnection(storeConnection,
     "EFTracingProvider" ,
     "EFCachingProvider"
)


 

小结

    EFCachingProvider是一个在System.Data.Common的装饰模式扩展包。所以它还可以应用在除了EntityFramework以外的其它数据库应用系统中。同时,它支持你在框架的基础上进行其它的扩展。

    如果你的数据库访问系统需要使用Caching、Tracing等功能,那你可以尝试一下使用这个扩展包。 : )

 


本文转自BloodyAngel博客园博客,原文链接:http://www.cnblogs.com/zgynhqf/archive/2010/11/08/1871900.html,如需转载请自行联系原作者

相关文章
|
2天前
|
机器学习/深度学习 数据可视化 PyTorch
PyTorch小技巧:使用Hook可视化网络层激活(各层输出)
这篇文章将演示如何可视化PyTorch激活层。可视化激活,即模型内各层的输出,对于理解深度神经网络如何处理视觉信息至关重要,这有助于诊断模型行为并激发改进。
8 1
|
9天前
|
数据可视化 API 数据库
R包:disgenet2r|DisGeNET的懒癌福利,一行代码多种可视化
DisGeNET是一个综合性的数据库,包含大量关于人类基因和疾病关联的信息,常用于生物信息学和基因组学研究。disgenet2r是R语言工具,方便用户访问和分析DisGeNET数据。用户需注册DisGeNET账号并安装R包,通过disgenet2r包可查询、检索基因-疾病关联和变异-疾病关联数据。目前DisGeNET包含超过110万个基因-疾病关联和30万个变异-疾病关联。使用示例包括查询特定疾病相关基因和多疾病联合分析。
20 0
|
1月前
|
人工智能 前端开发 API
graphengine图引擎模块 v2.2.10
graphengine图引擎模块 v2.2.10
29 1
|
9月前
打包(外观层)
打包(外观层)
42 0
|
9月前
|
存储
libjpeg库使用实例细节分析
libjpeg库使用实例细节分析
146 0
|
10月前
|
数据处理
数据处理 | R-tidyr包
数据处理 | R-tidyr包
|
数据采集 Web App开发 JavaScript
函数计算|如何使用层解决依赖包问题?
在使用阿里云函数计算平台时,如果您曾经遇到过以下问题,本文应该会对您有所帮助: 1. 第三方依赖包太大,每次更新代码都非常耗时,甚至会出现超过代码包限制的情况,我该怎么办? 2. 安装第三方依赖包后,可以在本地运行成功,上传到阿里云函数计算平台上就会报错,这是什么情况? 3. 有很多常用的依赖包,很多用户应该都会用到,阿里云函数计算官方不能直接内置到运行时环境中么? 4. 我在多个函数中有相同的依赖包,我该如何管理这些相同的依赖包?
函数计算|如何使用层解决依赖包问题?
|
存储 测试技术 数据安全/隐私保护
RobotFrameWork接口项目分层及通用控制方式
RobotFrameWork接口项目分层及通用控制方式
978 0
RobotFrameWork接口项目分层及通用控制方式