【发布时间】:2013-05-26 01:45:46
【问题描述】:
使用 StructureMap,假设我为给定接口配置了几个实例,由名称标识:
registry.For(interfaceType).Add(firstType).Named(firstName);
registry.For(interfaceType).Add(secondType).Named(secondName);
registry.For(interfaceType).Use(defaultType);
这很适合我的需求。但是,在某些应用场景中,我有理由重写一个实例以使用与另一个实例相同的具体类型。如此有效地使用这样的东西:
registry.For(interfaceType).Add(defaultType).Named(firstName);
registry.For(interfaceType).Add(defaultType).Named(secondName);
registry.For(interfaceType).Use(defaultType);
然而,实际上,StructureMap 似乎不仅使用相同的类型,而且使用相同的实例。所以在内存中确实有 一个 defaultType 实例,容器为任何命名请求提供它。
有没有办法告诉它构造和使用单独的实例,即使它们是相同的具体类型?
【问题讨论】:
-
如果我对this的理解正确,原因是默认情况下生命周期是
PerRequest,您需要通过执行registry.For(interfaceType).Add(defaultType).Named(firstName).LifecycleIs(new UniquePerRequestLifecycle());之类的操作来指定生命周期是唯一的跨度> -
@TI:看起来这走向了另一个极端,为每个请求提供一个新实例。我想要做的是介于两者之间的,某种每个实例名称唯一的生命周期。我还没有找到类似的东西,但你肯定给我指明了一个好的方向。也许我可以推出自己的
ILifecycle,或者作为最后的手段,在位于 StructureMap 和其余代码之间的服务定位器实现中内部跟踪实例。
标签: c# dependency-injection inversion-of-control structuremap