【问题标题】:Where to do DBContext.SaveChanges() if I'm using InRequestScope()如果我使用 InRequestScope(),在哪里做 DBContext.SaveChanges()
【发布时间】:2014-07-06 03:00:12
【问题描述】:

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

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

工作单元界面:

public interface IUnitOfWork
{
    void Commit();
}

自定义DbContext实现(我使用IUnitOfWork接口允许DI):

public class EFDbContext : DbContext, IUnitOfWork
{
    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        [ ... ]
    }

    public void Commit()
    {
        this.SaveChanges();
    }
}

这就是允许使用 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);
    }
}

最后,我在NinjectWebCommon

/// <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);
}

我使用 .InRequestScope() 是因为我希望每个请求都有一个 EFDbContext 实例。

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

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

【问题讨论】:

标签: asp.net asp.net-mvc entity-framework ninject ninject.web.mvc


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-15
    • 2015-03-21
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    • 2020-05-25
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多