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

Asp.net mvc 使用注入的DbContext以及在Startup.Auth中创建的DbContext,asp.net-mvc,dependency-injection,asp.net-identity,owin,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) {

在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的实例

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

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

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

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ApplicationDbContext>().ToSelf().InRequestScope();
不确定将上下文绑定到自身而不是创建接口是否是一种糟糕的做法?虽然它工作得很好

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

将DbContext注册为self和per-request生存期是很正常的

我个人喜欢实现IDbContext接口,这样当我对存储库进行单元测试时,可以更清晰地模拟它。因此,依赖于抽象而不是具体的实现

public class ApplicationDbContext : DbContext, IDbContext
{
}

谢谢你,谢谢你的回答。对Startup.Auth有什么评论吗?我只是看到你注册了两次。如果使用Ninject,请不要在Startup.ConfigureAuth中注册依赖项。相反,将它们放在内部,让Ninject IoC容器负责注册、解析和发布。谢谢,我不知道如何将IApplicationDbContext注入ConfigureAuthIAppBuilder应用程序?您能否详细说明您试图实现的目标,或者使用示例代码创建一个新问题?在MVC中,有一个启动类,调用:ConfigureAuthapp;如果我想注入ApplicationDbContext,我需要将其注入ConfigureAuth,但我不知道如何进行。在我的项目中,我放弃了Owin创建,并将ApplicationDbContext、ApplicationUserManager和ApplicationSignInManager的所有创建委托给我的DI容器。不要把这些东西混在一起,否则你会吃到阿克沃德bugs@CodeNotFound:谢谢,你能分享如何做到这一点吗?当你可以调用ApplicationDbContext.Create来获取实例时,为什么要注入Startup.Auth。只是做完后别忘了把它处理掉。仅仅因为您正在使用DI,并不意味着您应该将内容注入到每个不可能的地方。@trailmax:感谢您澄清这一点,所以您的建议是2个ApplicationDbContext实例就可以了?我不喜欢更改内置模板的想法,我只是认为既然ninject可以共享DB上下文,这可能是个好主意,并且正在寻找一些关于此的输入。@Hooman ConfigureAuth在应用程序启动时执行,甚至可能在初始化ninject容器之前执行。在您有任何http请求之前,它将超出范围,因此不可能有冲突的dbContext实例。
public interface IDbContext
{
   DbSet<MyEntity> MyEntities { get; set; }
   ...
}