在Asp.Net Core中註入DbContext。具體類型還是界面?

asp.net-core entity-framework-core

在Asp.Net Core項目中,我注入了Entity Framework DbContext:

public MessageRepository(MyDbContext context) {
}

配置是:

services
  .AddEntityFramework()
  .AddSqlServer()
  .AddDbContext<Context>(x => x.UseSqlServer(connectionString);

我應該創建一個接口,IMyDbContext,然後注入它嗎?

public class MyDbContext : DbContext, IMyDbContext { }

public MessageRepository(IMyDbContext context) {
}

在所有ASP.NET Core示例中,我看到正在註入具體類型MyDbContext而不是接口...

我應該選擇什麼選項?

一般承認的答案

我們總是注入一個接口,因為它更容易在單元和集成測試中進行模擬。

  1. 您是否願意更改MessageRepository構造函數的簽名?它依賴於具體類型。
  2. 你為代碼編寫測試嗎?使用和接口可以更輕鬆地模擬數據庫上下文。

如果您對上述一項或多項回答“否”,請注入具體類型;否則,注入接口。


熱門答案

目前我正在開展一個項目,我決定使用這樣的2個接口

public interface IDbContext : IDisposable
{
    DbContext Instance { get; }
}

public interface IApplicationDbContext : IDbContext
{
    DbSet<MyEntity> MyEntities { get; set; }
    ...
}

然後我的具體DbContext將實現應用程序上下文接口

public class ApplicationDbContext : DbContext, IApplicationDbContext
{
    public DbContext Instance => this

    public DbSet<MyEntity> MyEntities { get; set; }
}

這允許我將Application上下文的實現注入為應用程序上下文接口,同時還允許我通過Instance屬性getter訪問DbContext方法,而無需將DbContext類所需的方法添加到接口。

到目前為止,這很有效。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow