我写了下面这段数据库事务包装器:
public class ExampleWrapper : IDisposable
{
public DbContextTransaction Transaction { get; set; }
public DcatContext DatabaseContext { get; set; }
public ExampleWrapper ()
{
DatabaseContext = new someContext();
Transaction = DatabaseContext.Database.BeginTransaction();
}
public void Dispose()
{
Transaction.Dispose();
}
public void Commit()
{
Transaction.Commit();
}
public void RollBack()
{
Transaction.Rollback();
}
}我的DAL中有类似以下代码的代码:
public async Task<Object> Retrieve(string Id)
{
using (var context= new SomeContext())
{
return Context.Object.Find(id);
}
}我试图将业务层与任何实体框架依赖项分开,这就是包装器类的原因。如果我尝试从BLL执行事务,例如:
using(var wrapper = new ExampleWrapper())
{
//make calls to the DAL
something.Retrieve(Id)
}我的问题是,我初始化了Dbcontext两次(这里是在创建事务时,也是在DAL中)。你们有什么建议可以让我把这件事做得更好?
PS:以在事务中使用retrieve为例。
发布于 2016-09-28 14:23:23
您可以使用依赖注入(例如,Ninject)将DbContext注入到包装器中。然后,您可以定义DBContext实例的生命周期。如果它是web应用程序,那么您可以将DbContext的生命周期定义为在Web请求(InRequestScope)的生命周期内,以便在Web请求结束后自动处理DbContext。
您将不再需要创建DbContext,因为Ninject会为您创建它并管理其处置。
https://stackoverflow.com/questions/39738459
复制相似问题