Entity Framework Core中Scoped生命周期DbContext实例一致性问询
问题解答
代码实现
public class CommandObject { private readonly MyContext myContext; public CommandObject(MyContext myContext) { this.myContext = myContext; } public void CreateFoo() { myContext.Foos.Add(new Foo()); myContext.SaveChanges(); } } public class SeparateFooService { private readonly CommandObject commandObject; public SeparateFooService(CommandObject commandObject) { this.commandObject = commandObject; } public void CreateTwoFoos() { commandObject.CreateFoo(); commandObject.CreateFoo(); } } public class TransactionalFooService { private readonly MyContext myContext; private readonly CommandObject commandObject; public TransactionalFooService(MyContext myContext, CommandObject commandObject) { this.myContext = myContext; this.commandObject = commandObject; } public void CreateTwoFoos() { using (var transaction = myContext.Database.BeginTransaction()) { commandObject.CreateFoo(); commandObject.CreateFoo(); transaction.Commit(); } } }
问题答案
是同一个实例。
因为MyContext被配置为Scoped生命周期,在同一个作用域(比如同一个HTTP请求、同一个服务解析上下文)内,依赖注入容器只会创建一个MyContext实例,所有依赖它的对象(包括TransactionalFooService本身和它依赖的CommandObject)都会拿到这个唯一的实例。
也就是说,当TransactionalFooService被容器解析时,容器会先获取当前作用域的MyContext实例,把它注入给TransactionalFooService;同时解析CommandObject时,容器也会使用同一个作用域下的MyContext实例注入进去,所以两者内部的myContext是同一个对象。
内容的提问来源于stack exchange,提问作者NAUGHTIOUS MAXIMUS
相关产品推荐
相关产品推荐

