如何从ApplicationDbContext中生成接口类

本文关键字:接口 ApplicationDbContext | 更新日期: 2023-09-27 18:25:22

我正试图用ApplicationDbContext制作一个接口,它扩展了IdentityDbContext

 public class ApplicationDbContext : IdentityDbContext<ApplicationUser>, 
                                     IApplicationDbContext
 {
    public ApplicationDbContext()
        : base("AppContext")
    {
    }
   // Should I add below line? without any unwanted behavior?
   // public DbSet<ApplicationUser> User { get; set;}
    public  DbSet<Book> Books { get; set; }
 }

我的界面将是

 public interface IApplicationDbContext : IDisposable
 {
     // Should I add below line?
     // DbSet<ApplicationUser> User { get;}
     DbSet<Book> Books { get; }
     int SaveChanges();
 }

这种方法的问题是,我失去了对来自IdentityDbContext的"Users"的访问权限。用户

 private ApplicationDbContext ctx = new ApplicationDbContext();
 ctx.Users.somthing() works

但对于以下内容,编译器会抱怨

 private IApplicationDbContext ctx = new ApplicationDbCOntext();
 ctx.Users.something..

IApplicationDbContext不包含"Users"的定义,也没有扩展方法"Users"

我想我错过了一个关键的概念。

你能帮我吗?

如何从ApplicationDbContext中生成接口类

如果您将ctx作为IApplicationDbContext的实例进行delcare,则表示您只想了解IApplicationDbContext接口中的那些东西,而不管接口的具体实现是什么。

如果您想同时访问IdentityDbContext<ApplicationUser>成员IApplicationDbContext成员,则需要delcare同时具有这两种属性的类型,例如您的ApplicationDbContext类。

或者,最好不要在ApplicationDbContext的具体实现中扩展IdentityDbContext<ApplicationUser>,而是遵循组合优先于继承的原则,并允许ApplicationDbContext拥有IdentityDbContext<ApplicationUser>的实例,例如

public class ApplicationDbContext : IApplicationDbContext
{
    private readonly IdentityDbContext<ApplicationUser> _dbContext;
    public IDbSet<ApplicationUser> Users { get { return _dbContext.Users; } }
    public ApplicationDbContext(IdentityDbContext<ApplicationUser> dbContext)
    {
        _dbContext = dbContext;
    }
    public DbSet<Book> Books { get; set; }
}

如果需要,还可以更改接口定义以提供Users属性。这允许你仍然可以访问你需要的信息,同时隐藏你不需要的信息。参见

http://en.wikipedia.org/wiki/Composition_over_inheritance和http://en.wikipedia.org/wiki/Information_hiding了解更多信息。