数据层扩展包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,如需转载请自行联系原作者

相关文章
|
1天前
|
编译器 API PHP
深入PHP扩展开发:打造高效自定义模块
【4月更文挑战第30天】 在追求性能优化和特定功能实现的道路上,PHP提供了一种强大机制——扩展。本文将引导读者通过编写一个简单的PHP扩展来探索扩展开发的世界。我们将涉及从环境搭建到代码实现,再到扩展的编译与加载的完整流程,确保读者能够理解并实践如何创建高效的自定义PHP模块。
|
4天前
|
运维 监控 Serverless
Serverless 应用引擎产品使用之阿里函数计算中在自定义环境下用debian10运行django,用官方层的python3.9,配置好环境变量后发现自定义层的django找不到了如何解决
阿里云Serverless 应用引擎(SAE)提供了完整的微服务应用生命周期管理能力,包括应用部署、服务治理、开发运维、资源管理等功能,并通过扩展功能支持多环境管理、API Gateway、事件驱动等高级应用场景,帮助企业快速构建、部署、运维和扩展微服务架构,实现Serverless化的应用部署与运维模式。以下是对SAE产品使用合集的概述,包括应用管理、服务治理、开发运维、资源管理等方面。
12 3
|
14天前
|
机器学习/深度学习 PyTorch 算法框架/工具
PyTorch中的自定义层与模块开发
【4月更文挑战第18天】PyTorch教程:通过继承`nn.Module`创建自定义层和模块。自定义层需实现`__init__`(初始化参数)和`forward`(前向传播逻辑)方法。示例代码展示了一个简单的`CustomLinear`层和包含该层及ReLU激活的`CustomModule`。自定义模块可组合多个层,如`SimpleNet`模型中使用两个`CustomModule`。这使得构建满足特定需求的复杂神经网络成为可能。
|
3月前
|
人工智能 安全 搜索推荐
产品服务扩展模块或附加组件
产品服务扩展模块或附加组件
14 2
|
数据采集 Web App开发 JavaScript
函数计算|如何使用层解决依赖包问题?
在使用阿里云函数计算平台时,如果您曾经遇到过以下问题,本文应该会对您有所帮助: 1. 第三方依赖包太大,每次更新代码都非常耗时,甚至会出现超过代码包限制的情况,我该怎么办? 2. 安装第三方依赖包后,可以在本地运行成功,上传到阿里云函数计算平台上就会报错,这是什么情况? 3. 有很多常用的依赖包,很多用户应该都会用到,阿里云函数计算官方不能直接内置到运行时环境中么? 4. 我在多个函数中有相同的依赖包,我该如何管理这些相同的依赖包?
函数计算|如何使用层解决依赖包问题?
|
SQL Java 数据库连接
数据层设计与开发(数据层标准实现类) | 学习笔记
简介:快速学习数据层设计与开发(数据层标准实现类)
123 0
数据层设计与开发(数据层标准实现类) | 学习笔记
|
数据库 开发者
数据层设计与开发(定义数据层标准) | 学习笔记
简介:快速学习数据层设计与开发(定义数据层标准)
152 0
数据层设计与开发(定义数据层标准) | 学习笔记
|
存储 测试技术 数据安全/隐私保护
RobotFrameWork接口项目分层及通用控制方式
RobotFrameWork接口项目分层及通用控制方式
979 0
RobotFrameWork接口项目分层及通用控制方式