如何从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"
我想我错过了一个关键的概念。
你能帮我吗?
如果您将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了解更多信息。