如何跨多个注入服务继承 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();
}
}
我在 .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();
}
}