【问题标题】:Unity is reusing my DbContext instead of creating a new instance each timeUnity 重用我的 DbContext 而不是每次都创建一个新实例
【发布时间】:2015-02-18 02:23:34
【问题描述】:

我正在尝试使用 Unity 作为解析器来创建我的 Breeze Web API 控制器。使用断点,我的 AHSEFContextProvider 的构造函数似乎只被调用一次。 Breeze 每次都需要一个新实例,否则 SaveChanges() 方法无法正常工作。我是 Unity 的新手,但我认为使用 TransientLifetimeManager(我相信无论如何都是默认设置)会导致每次创建一个新实例。下面是从 Global.asax Application_Start 调用的 UnityConfig 代码。关于我哪里出错的任何想法?

var container = new UnityContainer();
container.RegisterType<AHSEFContextProvider<TaskDbContext>>(new TransientLifetimeManager(), new InjectionConstructor("ConnectionStringName"));
container.RegisterType<TaskController>(new TransientLifetimeManager(), new InjectionConstructor(container.Resolve<AHSEFContextProvider<TaskDbContext>>()));
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);

【问题讨论】:

  • 我认为您可能希望将 PerHttpRequestLifetimeManager 用于 EF 上下文。 msdn.microsoft.com/en-us/library/… 。有关更多信息,请参阅以下 SO 帖子:stackoverflow.com/questions/5187562/…
  • 感谢您的提示,但从 TransientLifetimeManager 更改为 PerResolveLifetimeManager 并没有任何区别。
  • 嗯.. 这是一种期望的行为(或者至少应该是)。您希望上下文的多个实例四处浮动,即使出于某种原因您认为确实如此。你会遇到各种各样的问题。每个请求应该有一个上下文实例。除此之外的任何事情都是自找麻烦。

标签: entity-framework asp.net-web-api unity-container breeze


【解决方案1】:

通过将 [InjectionConstructor] 属性添加到 Breeze 控制器上的构造函数,我能够使其正常工作。然后按如下方式更改我的 Unity 配置:

var container = new UnityContainer();
container.RegisterType<AHSEFContextProvider<TaskDbContext>>(new InjectionConstructor("ConnectionStringName"));
container.RegisterType<AHS.Apps.Task.Server.BreezeControllers.TaskController>();
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);

【讨论】:

  • 搞清楚这一点做得很好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 2012-10-07
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 2014-08-14
相关资源
最近更新 更多