gpt4 book ai didi

asp.net - 如果我使用 InRequestScope(),在哪里执行 DBContext.SaveChanges()

转载 作者:行者123 更新时间:2023-12-02 01:47:41 32 4
gpt4 key购买 nike

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

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

工作接口(interface)单元:

public interface IUnitOfWork
{
void Commit();
}

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

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

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

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

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

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()

最佳答案

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

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

关于asp.net - 如果我使用 InRequestScope(),在哪里执行 DBContext.SaveChanges(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24587265/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com