EF核心可重用DbContext

时间:2019-09-09 13:22:15

标签: c# asp.net-core entity-framework-core

我正在尝试为使用ASP Net Core制作的未来Web应用程序创建可重用的基础。 我创建了一个库,其中包含一个从IdentityDbContext继承的BaseDbContext:

public class BaseDbContext : IdentityDbContext<ApplicationUser>
    {
        public BaseDbContext(DbContextOptions options) : base(options)
        {

        }   
    }

在此库中,有一些用于登录和创建用户的服务。

每次创建一个新的WebApplication时,我都会引用该库,并创建一个新的DbContext,如下所示:

public class ProjectDbContext : BaseDbContext
{
    //some generics DBSET
    public ProjectDbContext (DbContextOptions<ProjectDbContext> options) : base(options)
    {
    }
}

在启动阶段:

    services.AddDbContext<ProjectDbContext>(options =>
    {
        options.UseSqlServer(connection);
    });

由于用于登录和创建用户的服务需要引用BaseDbContext,因此我在基础项目中创建了一个IDbContextFactory,该项目将由主项目实现,如下所示:

public class ProjectContextFactory : IDbContextFactory
{
    private readonly ProjectDbContext _projectDbContext;

    public ProjectDbContextFactory(ProjectDbContext remDbContext)
    {
        _remDbContext = remDbContext;
    }

    public BaseDbContext GetBaseDbContext()
    {
        return _projectDbContext;
    }
}

该工厂将在基础项目中使用,以获取对BaseDbContext的引用。

这是一件好事吗?这样会产生一些问题吗?

1 个答案:

答案 0 :(得分:1)

通常,不,这不是一件好事。

  

将包含将用于所有Web应用程序的实体

如果存在所有项目共有的实体,则应将它们完全排除。换句话说,您将拥有一个具有UserContext之类的上下文的项目(您的基础项目),它将具有您的UserCredential实体,然后每个其他项目都将具有其拥有自己的单独上下文,可以处理所需的内容。如果其他应用程序需要访问用户,则可以通过UserContext的实例来访问,或者最好通过服务(例如API)来访问用户。

也就是说,听起来您正在滚动自己的身份验证,您应该着重不要这样做。使用身份。而且,如果您需要在应用程序之间共享它们,则需要一个集中的身份验证提供程序,例如Identity Server。

相关问题