使用注入的DbContext以及在Startup.Auth中创建的DbContext

时间:2018-05-02 19:35:02

标签: asp.net-mvc dependency-injection asp.net-identity owin

在Asp.Net MVC中,默认模板附带Startup.Auth.cs中的Startup类

public partial class Startup
{
    // For more information on configuring authentication, please visit http://go.microsoft.com/fwlink/?LinkId=301864
    public void ConfigureAuth(IAppBuilder app)
    {
        // Configure the db context, user manager and signin manager to use a single instance per request
        app.CreatePerOwinContext(ApplicationDbContext.Create);
        app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
        app.CreatePerOwinContext<ApplicationSignInManager>(ApplicationSignInManager.Create);

根据此模板中的评论,每个请求都会创建一个 ApplicationDbContext 的实例。

在我的应用程序中,我正在使用存储库模式并将 ApplicationDbContext 注入存储库。就我而言,我正在使用Ninject,如果需要,它可以在多个存储库之间共享相同的上下文。

有没有办法在Startup.Auth中使用相同的 ApplicationDbContext ?不确定更改默认模板是否是个好主意,同时我们在1个请求中创建相同上下文的2个实例...

在我的Ninject代码中,我将 ApplicationDbContext 绑定到自身,如下所示:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();

不确定将上下文绑定到自身而不是创建接口这是一种不好的做法吗? (虽然工作正常)。

1 个答案:

答案 0 :(得分:1)

  

不确定将上下文绑定到自身是否是一种不好的做法   而不是创建一个接口?

DbContext注册为自我和每个请求的生命周期是很正常的。

个人喜欢实现IDbContext接口,因此在我对单元测试存储库时进行模拟会更加清晰。因此,my repositories依赖于抽象而不是具体实现。

public class ApplicationDbContext : DbContext, IDbContext
{
}

IDbContext

public interface IDbContext
{
   DbSet<MyEntity> MyEntities { get; set; }
   ...
}