我在我的项目中有多个DB,所有这些DB都应源自BaseDbContext
的抽象DbContext
。我的BaseDbContext
包含新方法和DbContext
方法的某些替代。我的一个DB应该使用身份,因此它应该继承自IdentityDbContext
,但也应该继承我的BaseDbContext
,因为它需要相同的逻辑。我怎样才能通过一个好的设计来做到这一点?
我考虑过的两个选项,它们的缺点是:
BaseDbContext
继承自IdentityDbContext
,当实际上仅在一个数据库中需要它们时,它将在我所有的DB中创建所有身份表。BaseDbContext
复制需要使用标识的代码,并且仅从IdentityDbContext
继承,这将导致代码复制附带的所有错误设计。 有更好的方法吗?我应该满足所列选项之一吗?
C#不允许多重继承。因此,从技术上讲,如果不进行代码复制或将IdentityDbContext
用作基础dbcontext,就无法实现这一目标。但是,您可以做的一件事是使接口具有所需的所有功能,然后阻止它BaseDbContext
和IdentityDbContext
,最后您可以拥有一个第三类,其中包含所需的实际功能,然后在您的BaseDbContext
和IdentityDbContext
只是调用该类的函数,这样可以避免重复的实现问题。
class A{
int test(){
//TODO: Complete
}
}
interface IBaseDbContext {
int test();
}
class MyIdentityDbContext:IBaseDbContext,IdentityDbContext {
private readonly _a;
MyIdentityDbContext(A a){
_a=a;
}
int test()=>_a.test();
}
class MyDbContext:IBaseDbContext,DbContext {
private readonly _a;
MyDbContext(A a){
_a=a;
}
int test()=>_a.test();
}
PS:照顾好dbcontext选项和所需的上下文构造函数输入,您自己,我只是想给您一个大概的想法。
PS2:如果您使用的是.net core3 +,则可以利用默认接口的实现。