Data处理从泛型接口继承的数据实体,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
}我使用调用类中的VehicleData执行DAL,如下所示。
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 )之间共享连接,从而避免从本地到分布式的事务升级发布于 2016-01-21 12:10:37
您是否使用IoC容器进行依赖注入?在IoC中有一些生活方式(每线程、每个web请求等等)例如,在温莎城堡中,您可以使用范围生活方式。你的代码会是这样的:
创建连接(linq2db):
container.Register(
Component.For<DataConnection>().UsingFactoryMethod(x =>
CreateDataConnection()).LifestyleScoped(),
Component.For<IData<Vehicle>>()
.ImplementedBy<VehicleData>().LifestyleScoped()
);
private static DataConnection CreateDataConnection()
{
return new DataConnection(new SqlServerDataProvider("", SqlServerVersion.v2008),
@"Data Source=(local);Initial Catalog=DB1;Persist Security Info=True;User ID=user;Password=pwd");
}执行一些db操作:
using (container.BeginScope())
{
var db = container.Resolve<DataConnection>();
db.BeginTransaction();
container.Resolve<IData<Vehicle>>().Update(...);
container.Resolve<IData<Vehicle>>().Update(...);
container.Resolve<IData<Vehicle>>().Update(...);
db.CommitTransaction();
}https://stackoverflow.com/questions/34921876
复制相似问题