我們使用企業庫作爲標準的DAL。現在,我想享受Dapper的好處。看看實現它只是擴展連接類。將Dapper添加到企業庫?
可以設想Dapper擴展企業庫,這樣我們就可以享受這兩個世界了嗎? 或者也許有人已經創建了這個?
我們使用企業庫作爲標準的DAL。現在,我想享受Dapper的好處。看看實現它只是擴展連接類。將Dapper添加到企業庫?
可以設想Dapper擴展企業庫,這樣我們就可以享受這兩個世界了嗎? 或者也許有人已經創建了這個?
是的,這是可以想象的,它工作得很好。我們使用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
{
var fooId =
connection.Query<int>("insert into Foo values (name = @name); select cast(scope_identity() as int",
new { name = "Foo" }).Single();
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?您可以執行查詢,而不是使用DataSets和DataReaders,它們會返回強類型的映射對象。
DTC是指「升級到DTC」的含義是什麼? – 2014-12-15 22:47:28
對不起,有一點被刪掉了縮寫。如果您在System.Transactions事務範圍內打開多個連接,ADO.NET將(默認情況下)自動從本地輕量級事務切換到使用分佈式事務處理協調器來管理事務。您將必須確保DTC服務正在運行並可以訪問。如果您手動在現有連接中登記交易,則可避免DTC開銷。 – Sprockincat 2014-12-15 23:33:17