实体框架核心 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 和依赖注入的主要内容,如果未能解决你的问题,请参考以下文章
带有私有 NuGet 包的 Blazor 依赖项注入和 EF/DbContext
.NET Entity Framework Core、依赖注入和线程的 DBContext System.ObjectDisposed 异常
将 DbContext 注入 LoggerProvider 会在 .NET Core 中引发 ***Exception
在依赖注入中使用 Entity Framework Core DbContext 时不调用 OnModelCreating