StructureMap移除单个实例

3

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

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


为什么这个实例变得无效了?你在做什么? - Steven
这是一个 Linq to SQL 数据上下文包装器。如果发生异常,就不应重用数据上下文,而应创建一个新的。 但在编写此注释时,我意识到我的数据上下文包装器可以处理数据上下文并创建一个新的… - rekna
1个回答

1

当您需要替换已注册服务的实例以解决损坏问题时,这通常表示该实例存在时间过长。 DataContext 是一个很好的例子。 DataContext 不应该超出创建它的(Web)请求的生命周期,因为它不是线程安全的。即使您没有处理 Web 应用程序,通常也会有某种请求在其中运行,并且每个请求都会获得自己的 DataContext 实例。

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

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

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


这正是我所做的... 实例在http请求的持续时间或任务的持续时间内进行作用域限定。但有时当出现异常时,需要执行一些额外的操作,包括将信息写入数据库。因此,我需要一个新的数据上下文。 - rekna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接