实体框架核心 DbContext 和依赖注入

Posted

技术标签:

【中文标题】实体框架核心 DbContext 和依赖注入【英文标题】:Entity Framework Core DbContext and Dependency Injection 【发布时间】:2016-11-08 19:17:40 【问题描述】:

我正在使用 Web API、.Net Core 和 EntityFramework Core 构建服务应用程序。

为了在我的 DbContext 中配置选项,我在 Startup.cs 的“ConfigureServices”方法中使用这些行

 var connection = @"Server=ISSQLDEV;Database=EventManagement;Trusted_Connection=True;";
 services.AddDbContext<EMContext>(options => options.UseSqlServer(connection));

我知道如果我在控制器中添加上下文作为构造函数参数,.Net 将在构造函数中注入上下文。

但这不是我想要的行为。我不希望我的 web api 知道任何关于 dbcontext 的信息。我有一个 DataAccess 项目,它有一个处理所有 CRUD 操作的存储库类。

这意味着我只想在我的控制器中说 Repository.AddEvent(evt),然后存储库知道如何处理它。

另一方面,存储库使用简单的依赖解析器来获得正确的“IDataAdapter”实现。这些实现之一是 SQLDataAdapter。这就是我需要我的上下文的地方。

如何将我的上下文一直传递到这一点?

【问题讨论】:

【参考方案1】:

您可以通过构造函数注入将 dbcontext 从数据访问层添加到类中来解决此问题。

public class Startup

    public void ConfigureServices(IServiceCollection services)
    
        services.AddDbContext<ApplicationDbContext>(o => o.UseSqlServer(myConnStr));
        services.AddScoped<Repository>(); // 'scoped' in ASP.NET means "per HTTP request"
    


public class MvcController

    private Repository repo;
    public MvcController(Repository repo)
    
        this.repo = repo;
    

    [HttpPost]
    public void SomeEndpoint()
    
        this.repo.AddFoo(new Foo());
    


public class Repository

    private DbContext db;
    public Repository(ApplicationDbContext db)
    
        this.db = db;
    

    public void AddFoo(Foo obj)
    
        this.db.Set<Foo>().Add(obj);
        this.db.SaveChanges();
    

如果你想进一步定制你的 DbContext 是如何注入你的 DI 容器的,我建议你看看 .AddDbContext 实际在做什么。见https://github.com/aspnet/EntityFramework/blob/1.0.0/src/Microsoft.EntityFrameworkCore/EntityFrameworkServiceCollectionExtensions.cs#L142-L158

【讨论】:

以上是关于实体框架核心 DbContext 和依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

通过依赖注入实现后台任务的 DbContext

带有私有 NuGet 包的 Blazor 依赖项注入和 EF/DbContext

将 DbContext 与依赖注入一起使用

.NET Entity Framework Core、依赖注入和线程的 DBContext System.ObjectDisposed 异常

将 DbContext 注入 LoggerProvider 会在 .NET Core 中引发 ***Exception

在依赖注入中使用 Entity Framework Core DbContext 时不调用 OnModelCreating