【问题标题】:StructureMap remove a single instanceStructureMap 删除单个实例
【发布时间】:2012-11-25 16:09:13
【问题描述】:

有谁知道如何从对象缓存中删除单个实例? 我有一个使用 StructureMap 获取实例的类。在某些时候,一个实例可能会变得无效,所以我想将它从缓存中删除,以确保下次我调用ObjectFactory.GetInstance 时,我会得到一个新创建的实例。这应该适用于不同类型的生命周期。

我不想删除该类型的所有实例,也不想删除其他类型的任何其他实例。

【问题讨论】:

  • 为什么这个实例变得无效?在做什么?
  • 这是一个 linq to sql 数据上下文包装器。如果发生异常,则不应重用数据上下文,而应创建新的数据上下文。但是当我写这篇评论时,我意识到,我的 datacontext 包装器可以处理 datacontext 并创建一个新的......

标签: c# dependency-injection ioc-container structuremap


【解决方案1】:

当您因为损坏而需要用新服务替换已注册服务的实例时,这通常表明该实例的寿命过长。 DataContext 就是一个很好的例子。 DataContext 不应超过创建它的(Web)请求,因为它不是线程安全的。即使您不处理 Web 应用程序,通常也会有某种类型的请求在其中进行操作,并且每个请求都有自己的 DataContext 实例。

如果发生异常,您通常应该尽快中止整个操作。在大多数情况下,试图恢复和继续通常被认为是一件坏事。这是一个通用的软件原理,与 DI 无关。在大多数情况下,您并不确切知道出了什么问题,继续下去甚至会使事情变得更糟。继续不会使您的应用程序更健壮。它只会让查找错误变得更加困难。

长话短说:您最多应该在单个请求的生命周期内缓存DataContext,并且不要在发生异常时尝试替换它。让请求失败(并记录查找错误并修复它所需的所有信息)。

如果您正在运行 ASP.NET 应用程序,则可以将 DataContext 实例配置为 HttpContextScoped

【讨论】:

  • 这正是我所做的......实例的范围是在 http 请求期间或在 Task 期间。但有时当发生异常时,需要执行一些额外的操作,包括将信息写入数据库。所以我需要一个新的数据上下文。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-26
  • 2015-05-15
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
相关资源
最近更新 更多