You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 22:02:04