如何在OrmLite操作中添加SqlAzure重试逻辑?

时间:2013-10-03 22:30:50

标签: c# servicestack azure-sql-database ormlite-servicestack

我想让重试逻辑透明,理想情况下使用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

1 个答案:

答案 0 :(得分:1)

对此进行了进一步的研究,结果发现瞬态错误处理现在内置于.Net 4.6.1以后的SqlConnection中。因此,作为原始Ado.net SqlConnection支持Ormlite,任何自定义方法都应该是不必要的。