从基础DBContext继承

我的项目中有多个DB,所有DB都应来自BaseDbContext的抽象DbContext。我的BaseDbContext包含新方法和DbContext方法的某些替代。我的一个数据库应使用身份,因此它应继承自IdentityDbContext,但也应继承我的BaseDbContext,因为它需要相同的逻辑。 我怎样才能通过一个好的设计来做到这一点?

我考虑过的两个选项及其缺点是:

  1. 让我的BaseDbContext继承自IdentityDbContext,这将在我的所有数据库中实际上只需要它们时创建所有身份表。
  2. 在数据库中从BaseDbContext复制需要使用身份的代码,并且仅从IdentityDbContext继承,这将导致代码复制所带来的所有不良设计。

有更好的方法吗?我应该选择所列选项之一吗?

qilinz 回答:从基础DBContext继承

C#不允许多重继承。因此,从技术上讲,如果不进行代码复制或将IdentityDbContext用作基础dbcontext,就无法实现这一目标。但是,您可以做的一件事是使接口具有所需的所有功能,然后阻碍它BaseDbContextIdentityDbContext的使用,最后您可以拥有一个包含所需实际功能的第三类。然后在您的BaseDbContextIdentityDbContext中调用该类的函数,这样可以避免重复的实现问题。

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 +,则可以利用默认接口实现。

本文链接:https://www.f2er.com/3100022.html

大家都在问