【发布时间】:2016-04-27 14:06:15
【问题描述】:
Data Repository,它处理从通用接口继承的数据实体,DAL 层被实现为通用类,它以依赖注入的形式获取通用接口。以下是设计:
数据实体 - 车辆
public class Vehicle
{
public int Id {get; set;}
public string Brand {get; set;}
}
通用接口 - IData
public interface IData<T>
{
IEnumerable<T> Select(IDictionary<string,object> parameters);
int Update(IDictionary<string,object> parameters);
int Delete(IDictionary<string,object> parameters);
int insert(IDictionary<string,object> parameters);
}
车辆存储库
public class VehicleData : IData<Vehicle>
{
IEnumerable<Vehicle> Select(IDictionary<string,object> parameters)
{
using(IDbConnection conn = (Fetch Connection))
{
// Select Operation
}
}
int Update(IDictionary<string,object> parameters)
{
using(IDbConnection conn = (Fetch Connection))
{
// Update Operation
}
}
int Delete(IDictionary<string,object> parameters)
{
using(IDbConnection conn = (Fetch Connection))
{
// Delete Operation
}
}
int insert(IDictionary<string,object> parameters)
{
using(IDbConnection conn = (Fetch Connection))
{
// Insert Operation
}
}
}
DAL 类实现:
public class DAL<T>
{
public static IEnumerable<T> Select(IData<T> dataRepository, IDictionary<string,object> parameters)
{
return dataRepository.Select(parameters);
}
// Implementation for Insert, Update and Delete
}
我使用调用类中的DAL 执行VehicleData,如下所示。
IData<Vehicle> vehicleData = new VehicleData();
IDictionary<string,object> parameters = // Filled from client
DAL<Vehicle>.Select(vehicleData,parameters);
我面临的问题是,在每个 CRUD 方法中,IDbConnection 都是在 Using 块中创建的,因此在最后处置,因为它在本地上下文中,但是有一种情况,需要对各种实体进行多个 DAL 操作成为单个事务上下文的一部分,如果我以类似的方式继续,那么打开的事务上下文将被提升到分布式级别,因为多个连接资源正在打开,即使我可以在相同的连接上下文上执行它们,因为它们被一一执行。问题仍然存在:
如何在
DAL<Vehicle>.Update, DAL<Driver>.Update and DAL<Truck>.Update等多个调用之间共享连接,从而避免事务从本地升级到分布式不确定,在事务上下文中打开和处理连接是否意味着可以打开另一个连接而无需提升到分布式事务,在我看来这不会发生
【问题讨论】:
标签: c# generics interface transactionscope idbconnection