从基础DBContext继承时如何使用IdentityDBContex

问题描述 投票:1回答:1

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

我考虑过的两个选项,它们的缺点是:

  1. 使我的BaseDbContext继承自IdentityDbContext,当实际上仅在一个数据库中需要它们时,它将在我所有的DB中创建所有身份表。
  2. 从数据库中的BaseDbContext复制需要使用标识的代码,并且仅从IdentityDbContext继承,这将导致代码复制附带的所有错误设计。

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

c# inheritance identity dbcontext
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.