数据层扩展包EFCachingProvider 总结

简介:

  前不久学习了《EFCachingProvider》,该扩展包不但可以用于EntityFramework的扩展,所有与数据库连接相关的应用程序都可以使用类似的方案进行扩展。今天做个小的总结,以方便以后回顾。


 

总体描述

    关于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等功能,那你可以尝试一下使用这个扩展包。 : )

目录
相关文章
|
6月前
MyBatisPlus-标准数据层CRUD功能制作
MyBatisPlus-标准数据层CRUD功能制作
68 0
|
2月前
|
前端开发 IDE 数据库连接
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
本文详细介绍了ThinkPHP6中模型层的使用,包括模型属性设置、表映射关系、以及如何在控制层中使用模型层进行CRUD操作。
ThinkPHP6 模型层的模型属性,表映射关系,以及如何在控制层中使用模型层和模型层中的简单CRUD
|
5月前
|
运维 JavaScript Serverless
函数计算产品使用问题之构建自己的流水线时,已经有一个基础第三方包的层,想在这个基础上进行额外的第三方包安装,该如何实现
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
5月前
|
运维 Serverless API
函数计算产品使用问题之创建层如何设置才能支持ffmpeg
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
6月前
|
机器学习/深度学习 数据可视化 PyTorch
PyTorch小技巧:使用Hook可视化网络层激活(各层输出)
这篇文章将演示如何可视化PyTorch激活层。可视化激活,即模型内各层的输出,对于理解深度神经网络如何处理视觉信息至关重要,这有助于诊断模型行为并激发改进。
113 1
|
6月前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch中的自定义层与模块开发
【4月更文挑战第18天】PyTorch教程:通过继承`nn.Module`创建自定义层和模块。自定义层需实现`__init__`(初始化参数)和`forward`(前向传播逻辑)方法。示例代码展示了一个简单的`CustomLinear`层和包含该层及ReLU激活的`CustomModule`。自定义模块可组合多个层,如`SimpleNet`模型中使用两个`CustomModule`。这使得构建满足特定需求的复杂神经网络成为可能。
|
数据采集 Web App开发 JavaScript
函数计算|如何使用层解决依赖包问题?
在使用阿里云函数计算平台时,如果您曾经遇到过以下问题,本文应该会对您有所帮助: 1. 第三方依赖包太大,每次更新代码都非常耗时,甚至会出现超过代码包限制的情况,我该怎么办? 2. 安装第三方依赖包后,可以在本地运行成功,上传到阿里云函数计算平台上就会报错,这是什么情况? 3. 有很多常用的依赖包,很多用户应该都会用到,阿里云函数计算官方不能直接内置到运行时环境中么? 4. 我在多个函数中有相同的依赖包,我该如何管理这些相同的依赖包?
函数计算|如何使用层解决依赖包问题?
|
SQL Java 数据库连接
数据层设计与开发(数据层标准实现类) | 学习笔记
简介:快速学习数据层设计与开发(数据层标准实现类)
147 0
数据层设计与开发(数据层标准实现类) | 学习笔记
|
数据库 开发者
数据层设计与开发(定义数据层标准) | 学习笔记
简介:快速学习数据层设计与开发(定义数据层标准)
192 0
数据层设计与开发(定义数据层标准) | 学习笔记
|
Serverless TensorFlow 算法框架/工具
TensorFlow提取和重用层计算图中的节点
TensorFlow提取和重用层计算图中的节点
86 0