【问题标题】:How to inherit DatabaseContext as a base class across multiple injected services如何跨多个注入服务继承 DatabaseContext 作为基类
【发布时间】:2021-05-10 20:36:57
【问题描述】:

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

我正在使用 Autofac 依赖注入,并打算让单独的类继承某种形式的 BaseDatabaseContext 类,以免我在编写的每个类中都注入 DatabaseContext 类。

一个示例数据服务类:-

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 类:

public class BaseDatabaseContext {
    public readonly DatabaseContext _database;

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

DatabaseContext 类:

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 基本上有一个名为的公共变量,例如,database,它很容易使用,当被UserRepo 类继承时,我可以调用database.Users.XXX例如。

谁能指出我偏离轨道的地方?还是我已经实施(确实有效)的最佳方式?

【问题讨论】:

    标签: c# .net entity-framework autofac dbcontext


    【解决方案1】:

    每次都新建一个新的 DatabaseContext() 时,我非常不高兴。我觉得我可以通过依赖注入来实现这一点,但我想不通。

    如果 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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-26
      • 2021-03-13
      • 2015-03-10
      • 2019-03-07
      • 1970-01-01
      • 2011-05-29
      • 2021-03-24
      • 2012-05-20
      相关资源
      最近更新 更多