我想让重试逻辑透明,理想情况下使用Microsoft的Transient Fault Handling Application Block,而不是将每个访问数据库的代码包装到重试的函数中。
我可以做的是创建自定义IDbConnectionFactory
生成IDbConnection
类型的自定义MySqlAzureConnection
对象:
MySqlAzureConnection dbConn = myConnFactory.OpenDbConnection();
dbConn.Insert(new Employee { ... });
我有两个选择:
向.Insert()
添加MySqlAzureConnection
方法以隐藏
与OrmLite相同的扩展方法,提供我的重试逻辑。
实际上我的.Insert()
将包含完全相同的源代码
与在OrmLite中一样:调用dbConn.Exec()
,但.Exec()
将是。dbConn.Exec()
我的实现提供了重试逻辑
问题是(为了确保查询和写入
在我的程序中总是使用重试逻辑)这样我最终会
复制和粘贴所有120多种方法
[OrmLite] [Read | Write] ConnectionExtensions静态类,
只是为了扩展单using ServiceStack.OrmLite;
的行为。
听起来不太好。
省略ExecuteCommand()
以确保不重试
OrmLite的实现不会被调用。在这种情况下我该如何使用
OrmLite?我将不得不一直写完整的名称空间限定名称。
听起来也很可怕。
编辑:
我意识到还有第三种选择:放弃要求
重试逻辑是“透明的”。换句话说,承认明确使用
在每个使用OrmLite的代码中使用包装函数,以及
在该包装函数中实现重试逻辑。事实上,Transient Fault Handling Application Block
做同样的事情:介绍IDbConnection
,一种新方法
({{1}}中的非标准)并使开发人员负责
将它用作任何数据库访问代码的高级包装器。
虽然这个解决方案听起来比前两个好,但我仍然没有 对此感到满意。实体框架(6.0)已成功实现 这种弹性透明,我期待着类似的 解决方案在这(很容易连接到OrmLite的 ReadConnectionExtensions.Exec()方法 - 如果它不是静态扩展名 方法。更好的是可注射模块,如done in the Entity Framework)
答案 0 :(得分:1)
对此进行了进一步的研究,结果发现瞬态错误处理现在内置于.Net 4.6.1以后的SqlConnection中。因此,作为原始Ado.net SqlConnection支持Ormlite,任何自定义方法都应该是不必要的。
丹