Dependency injection 使用DbConnection、带连接池的DbTransaction、transactionScope和依赖项注入的正确方法?

Dependency injection 使用DbConnection、带连接池的DbTransaction、transactionScope和依赖项注入的正确方法?,dependency-injection,repository-pattern,transactionscope,system.data,system.data.oracleclient,Dependency Injection,Repository Pattern,Transactionscope,System.data,System.data.oracleclient,我有一个Oracle数据库,正在使用Oracle.ManagedDataAccess 在某些情况下,我需要在单个事务中执行操作,但通常不需要 我不确定在单个TransactionScope中处理DbConnection对象的最佳方法是什么 我可以将一个DbConnection注入存储库,然后甚至使用LifetimePerScope来确保它们都获得相同的DbConnection实例。但是,这是一个明智的举动吗?.Open()连接一次可以吗 using (var scope = _lifetimeS

我有一个Oracle数据库,正在使用
Oracle.ManagedDataAccess

在某些情况下,我需要在单个事务中执行操作,但通常不需要

我不确定在单个
TransactionScope
中处理
DbConnection
对象的最佳方法是什么

我可以将一个
DbConnection
注入存储库,然后甚至使用
LifetimePerScope
来确保它们都获得相同的
DbConnection
实例。但是,这是一个明智的举动吗?
.Open()
连接一次可以吗

using (var scope = _lifetimeScope.BeginLifetimeScope())
{
    var connection = scope.Resolve<IDbConnection>();
    var personRepo = scope.Resolve<IPersonRepository>();
    var workRepo = scope.Resolve<IWorkRepository>();
    connection.Open();
    var transaction = connection.BeginTransaction()
    personRepo.DeleteById(someId);
    workRepo.DeleteByPersonId(someId);
    transaction.Commit();
}
使用(var scope=\u lifetimeScope.BeginLifetimeScope())
{
var connection=scope.Resolve();
var personRepo=scope.Resolve();
var workRepo=scope.Resolve();
connection.Open();
var transaction=connection.BeginTransaction()
personRepo.DeleteById(someId);
workRepo.DeleteByPersonId(someId);
Commit();
}
这将迫使我始终使用
LifetimeScope
,即使不使用事务,也要在存储库方法之外打开连接

TransactionScope是否依赖于单个连接,或者我是否可以在同一事务中打开多个连接(当事务打开时,connectionPool如何处理这些连接?)

我完全不了解数据库连接以及所有这些,因此我可能完全误解了使用TransactionScope和数据库连接的最佳方式。

可能重复:

既然这有赏金,我不能把它标为复制品:(

无论如何,连接池主要是为您完成的。您应该尽快关闭连接,将它们返回到池中


事务与特定打开的连接相关,应在关闭连接时完成。

与BeginTransaction()相关的事务范围特定于连接。 如果要跨多个连接(多个数据库、资源)维护事务,则需要aware。下面是一个类似的示例。您需要使用
Oracle.ManagedDataAccessDTC.dll
来实现这一点

您可能需要浏览以下链接:

一,

二,

希望这有帮助