【发布时间】: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()放在哪里?
【问题讨论】:
-
你的问题的答案深埋在this Stackoverflow answer。
标签: asp.net asp.net-mvc entity-framework ninject ninject.web.mvc