如何跨多个注入服务继承 DatabaseContext 作为基础 class

How to inherit DatabaseContext as a base class across multiple injected services

我在 .NET Framework 中进行了以下代码优先数据库的迁移设置,并寻找感觉应该有更好的方法将 CRUD 的 DatabaseContext 继承到数据库。

我正在使用 Autofac 依赖项注入,并打算使用单独的 classes 继承某种形式的 BaseDatabaseContext class,以节省我注入 DatabaseContext class 每 class 我写。

示例数据服务class:-

public class UserRepo : BaseDatabaseContext, IUserRepo {
    public User WithCredentials(string emailAddress, string password) {
        return _database.Users.Where(x => x.EmailAddress == emailAddress && x.PasswordHash == password).SingleOrDefault();
    }
}

BaseDatabaseContext class:

public class BaseDatabaseContext {
    public readonly DatabaseContext _database;

    public BaseDatabaseContext() {
        _database = new DatabaseContext();
    }
}

DatabaseContext class:

public class DatabaseContext : DbContext {
    public DatabaseContext() : base("MainDatabase") {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
       /// stuff here
    }

    public DbSet<User> Users { get; set; }
    // ... more DbSet's here
}

上面的方法有效,但我非常不喜欢每次都新建一个新的 DatabaseContext()。我觉得我可以通过依赖注入来实现这一点,但我想不通。

我的总体目标是让 BaseDatabaseContext 基本上有一个名为 public 的变量,例如 database,它很简单,可以使用,并且当由 UserRepo class,我可以调用 database.Users.XXX 例如

谁能指出我偏离轨道的地方?还是我实施的(确实有效)是最好的方法?

I am extremely unkeen, on new-ing up a new DatabaseContext() every time. I feel like I could achieve this through dependency injection but can't figure it.

如果 BaseDatabaseContext 对 DatabaseContext 有“依赖”,则“注入”它,通常使用“构造注入”,但 AutoFac 也支持 Property Injection:

public class BaseDatabaseContext {
    public readonly DatabaseContext _database;

    public BaseDatabaseContext(DatabaseContext db) {
        _database = db;
    }
}

一个更简单的模式可能是让您的 DbContext 实现每个接口,也许使用 Explicit Interface Implementation 来避免弄乱 DatabaseContext API。例如

public class DatabaseContext : DbContext, IUserRepo {
    public DatabaseContext() : base("MainDatabase") {
    }

    protected override void OnModelCreating(DbModelBuilder modelBuilder) {
       /// stuff here
    }

    public DbSet<User> Users { get; set; }
    // ... more DbSet's here

    public User IUserRepo.WithCredentials(string emailAddress, string password) {
        return this.Users.Where(x => x.EmailAddress == emailAddress && x.PasswordHash == password).SingleOrDefault();
    }
}