Asp.net 如果I';我正在使用InRequestScope()

Asp.net 如果I';我正在使用InRequestScope(),asp.net,asp.net-mvc,entity-framework,ninject,ninject.web.mvc,Asp.net,Asp.net Mvc,Entity Framework,Ninject,Ninject.web.mvc,我正在开发一个ASP.NET MVC 5 Web API应用程序,其中包括C#、.NET Framework 4.5.1、Entity Framework 6.1.1和Ninject的最新版本(我还安装了Ninject.MVC5) 我正在学习如何实现依赖注入,我想我已经学会了,但我有一个问题。这些是我的接口和类 工作单位界面: public interface IUnitOfWork { void Commit(); } 自定义DbContext实现(我使用IUnitOfWork接口来

我正在开发一个ASP.NET MVC 5 Web API应用程序,其中包括C#、.NET Framework 4.5.1、Entity Framework 6.1.1和Ninject的最新版本(我还安装了Ninject.MVC5)

我正在学习如何实现依赖注入,我想我已经学会了,但我有一个问题。这些是我的接口和类

工作单位界面:

public interface IUnitOfWork
{
    void Commit();
}
自定义
DbContext
实现(我使用
IUnitOfWork
接口来允许DI):

这就是允许使用Ninject和Ninject.Web.Common进行依赖项注入的方式

我有一个类,
NinjectConfigurator
,它添加了绑定:

public class NinjectConfigurator
{
    public void Configure(IKernel container)
    {
        // Add all bindings/dependencies
        AddBindings(container);

        // Use the container and our NinjectDependencyResolver as
        // application's resolver
        var resolver = new NinjectDependencyResolver(container);
        GlobalConfiguration.Configuration.DependencyResolver = resolver;
    }

    private void AddBindings(IKernel container)
    {
        ConfigureLog4net(container);

        container.Bind<IUnitOfWork>().To<EFDbContext>().InRequestScope();
        container.Bind<IGenericRepository<User>>().To<GenericRepository<User>>();
    }

    private void ConfigureLog4net(IKernel container)
    {
        log4net.Config.XmlConfigurator.Configure();
        var loggerForWebSite = LogManager.GetLogger("MattSocialNetworkWebApi");
        container.Bind<ILog>().ToConstant(loggerForWebSite);
    }
}
我使用
.InRequestScope()
,因为我希望每个请求都有一个
EFDbContext
实例

我的问题是:我什么时候必须执行
EFDbContext.SaveChanges()
?如果每个请求使用一个实例,我想我必须在请求结束时保存更改,不是吗


我必须将
EFDbContext.Commit()
放在哪里?

我这样做的方式,以及我在其他地方看到的做法,是在每次事务完成后在业务层或控制器中进行提交。这意味着有时每个请求都会多次调用SaveChanges(),但这应该不是什么大问题


通过查看SocialGoal的代码,我学到了很多,可以找到。它对DI使用Autofac,但其原理与您自己的代码相同。也许你也能从那里得到一些灵感和答案

你问题的答案深藏其中。
public class NinjectConfigurator
{
    public void Configure(IKernel container)
    {
        // Add all bindings/dependencies
        AddBindings(container);

        // Use the container and our NinjectDependencyResolver as
        // application's resolver
        var resolver = new NinjectDependencyResolver(container);
        GlobalConfiguration.Configuration.DependencyResolver = resolver;
    }

    private void AddBindings(IKernel container)
    {
        ConfigureLog4net(container);

        container.Bind<IUnitOfWork>().To<EFDbContext>().InRequestScope();
        container.Bind<IGenericRepository<User>>().To<GenericRepository<User>>();
    }

    private void ConfigureLog4net(IKernel container)
    {
        log4net.Config.XmlConfigurator.Configure();
        var loggerForWebSite = LogManager.GetLogger("MattSocialNetworkWebApi");
        container.Bind<ILog>().ToConstant(loggerForWebSite);
    }
}
/// <summary>
/// Load your modules or register your services here!
/// </summary>
/// <param name="kernel">The kernel.</param>
private static void RegisterServices(IKernel kernel)
{
    var containerConfigurator = new NinjectConfigurator();
    containerConfigurator.Configure(kernel);
}