【发布时间】:2015-05-23 02:35:23
【问题描述】:
所以我目前正在开发一个使用实体框架的 ASP.NET MVC Web 应用程序,我也在使用 Ninject 进行依赖注入。
所以,目前,这就是我向 Ninject 注册 DbContext 和服务的方式。
kernel.Bind<DbContext>().To<MyApplicationContext>().InSingletonScope();
kernel.Bind<IAccountService>().To<AccountService>().InSingletonScope();
kernel.Bind<IRegionService>().To<RegionService>().InSingletonScope();
kernel.Bind<IRoleService>().To<RoleService>().InSingletonScope();
我用InSingletonScope注册它们,这意味着它们只会被创建一次并在应用程序的整个生命周期中使用(至少我是这么理解的)。
控制器:
private IAccountService _accountService;
public MemberController(IAccountService accountService)
{
_accountService = accountService;
}
但是,我深感这个单例范围会在我的 Web 应用程序中引起问题,尤其是实体框架的上下文,因为它是单例的。
因此,我已经面临一个小问题,如果我使用 SQL Management Studio 手动更新数据库,我的 Web 应用程序的实体框架中的数据在我重新启动应用程序之前不会更新(似乎是一些缓存机制英孚)。
--
但是,如果我删除 InSingletonScope,我会随机收到来自 EF 的错误消息:
一个实体对象不能被多个 IEntityChangeTracker 实例引用
我理解为什么会发生这种情况,因为 AccountService 初始化的 DbContext 可能与 RegionService 不同。但我不知道如何解决这个问题。
我对依赖注入的理解还很有限,有大神可以指教一下吗?
--
编辑:我已尝试将所有注射更改为 InRequestScope,但我仍然得到 p>
一个实体对象不能被多个 IEntityChangeTracker 实例引用
当尝试从我的应用程序中的另一个服务插入具有相关对象(外键)的新实体时。这意味着他们仍在使用不同的 DbContext,发生了什么?!
最终编辑:好的,我找到了问题,是我的缓存机制缓存了先前的请求,导致所有后续请求出现关系问题。
【问题讨论】:
-
我认为您正在体验Captive Dependencies。您可能将 DbContext 注入到注册为单例的使用者中,导致 DbContext 也成为单例。
-
@Steven 你指的是空导航属性问题吗?我已经把所有的消费者都改成了 RequestScope 了,为什么还是单例呢?
-
我不熟悉导航属性问题,所以我无法对此发表评论,我无法说明为什么以及您的 DbContext 是否被消费者保持活跃,因为您没有t 发布了任何重现该问题的代码。 Ninject 缺乏为您找到它的工具;你将不得不调试这个。
标签: c# asp.net-mvc entity-framework dependency-injection ninject