我们将企业库用作标准 DAL。现在,我想享受 Dapper 带来的好处。查看实现它只是扩展连接类。
是否可以将 Dapper 设置为扩展 Enterprise Library 以便我们可以享受这两个世界?或者也许有人已经创建了这个?
我们将企业库用作标准 DAL。现在,我想享受 Dapper 带来的好处。查看实现它只是扩展连接类。
是否可以将 Dapper 设置为扩展 Enterprise Library 以便我们可以享受这两个世界?或者也许有人已经创建了这个?
是的,这是可以想象的,而且效果很好。我们使用 Dapper 来补充一些较旧的 EntLib 代码,简单的查询既快速又轻松。最大的挑战是让事务正常工作。您没有提及您使用的是哪个版本的 EntLib,但 4.0 和更新版本管理 TransactionScopes 内部的连接,因此如果您尝试使用 EntLib 在范围内为 Dapper 打开另一个连接,它将自动从轻量级本地事务升级到 DTC (分布式事务协调器)。EntLib 并没有真正提供获取当前打开连接的方法,因此您必须从 Database 类派生并公开 GetOpenConnection 方法。
public class EntLibDatabaseWrapper : Database
{
// ...Constructor and overrides...
public IDbConnection GetMyOpenConnection()
{
var connectionWrapper = GetOpenConnection();
return connectionWrapper.Connection;
}
}
然后像这样使用它:
var db = DatabaseFactory.CreateDatabase();
var dbWrapper = new EntLibDatabaseWrapper(db.ConnectionString, db.DbProviderFactory);
using (var scope = new TransactionScope())
{
var connection = dbWrapper.GetMyOpenConnection();
try
{
// Insert a test value using dapper
var fooId =
connection.Query<int>("insert into Foo values (name = @name); select cast(scope_identity() as int",
new { name = "Foo" }).Single();
// Insert a test value using Enterprise Library
var cmd =
db.GetSqlStringCommand(
"insert into Foo values (name = 'Bar'); select cast(scope_identity() as int)");
var barId = int.Parse(db.ExecuteScalar(cmd));
scope.Complete();
}
catch (Exception)
{
connection.Close();
throw;
}
}
如果您有更大的事务范围,那么您必须在关闭每个连接之前检查您是否处于活动事务中。
if(Transaction.Current == null)
connection.Close();
如果只能使用 Dapper,为什么还要使用 Enterprise Library?您可以执行查询,而不是使用 DataSet 和 DataReaders,这些查询会返回强类型映射对象。