public class Act
{
public int Id {get;set;}
public virtual Operation Operation {get;set;}
}
public class Operation
{
public int Id {get;set;}
public virtual Act Act {get;set;}
}
public class ActService
{
private readonly DbContext _context;
public ActService(DbContext context)
{
this._context = context;
}
public void Delete(int actId)
{
var entity = _context.Set<Act>().Single(x => x.Id == actId);
//бизнес логика удаления объекта
_context.Entry(entity).State = EntityState.Deleted;
_context.SaveChanges()
}
}
public OperationService
{
private readonly DbContext _context;
private readonly ActService _actService;
public OperationService(DbContext context, ActService actSErvice)
{
this._context = context;
this._actService = actService;
}
public void Delete(int operationId)
{
var entity = _context.Set<Operation>().Include(x => x.Act)(x => x.Id == operationId);
//бизнес логика удаления объекта
using(var transaction = _context.Database.BeginTransaction())
{
try
{
_actService.Delete(operation.Act.Id);
_context.Entry(entity).State = EntityState.Deleted;
_context.SaveChanges();
transaction.Commit();
}
catch(Exception)
{
throw;
}
}
}
}
该项目使用autofac版本 4.6.1。依赖注入通过构造函数发生。
告诉我如何正确实现依赖关系解析,这样就不会违反应该删除所有内容或不删除任何内容的逻辑。
PS:我阅读了网站上的帮助,我认为它DbContext应该作为服务实现,.InstancePerLifetimeScope()但我.InstancePerRequest()不确定。
为了确保 DbContext 实例相同,必须使用显式生命周期创建它。
这意味着您不能使用 Instance Per Dependency(原因很明显)和 Instance Per Lifetime Scope(因为 Lifetime Scope 可能突然不同)选项。
使用 Single Instance、Instance Per Matching Lifetime Scope、Instance Per Request 和 Instance Per Owned 是有效的(最后两个实际上是同一个 Instance Per Matching Lifetime Scope)。
同时,可以使用不低于上下文生命周期的任何生命周期创建服务本身(即,即使每个依赖的实例也不会破坏任何东西)。
如果无论 DI 设置如何都希望保证正确操作(尽管这很奇怪) - 您将不得不更改代码。
例如,您可以将 DbContext 作为方法参数传递:
或者,如果价格适合他们,您可以使用环境事务(如果意外使用了多个上下文,则自动升级到分布式事务):