【问题标题】:Multiple Instances of the Same Type同一类型的多个实例
【发布时间】: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


【解决方案1】:

这不是我看到的行为:

ObjectFactory.Configure(cfg =>
{
    cfg.For<IFoo>().Add<Foo>().Named("Foo1");
    cfg.For<IFoo>().Add<Bar>().Named("Foo2");
    cfg.For<IFoo>().Use<Foo>();
});

var foo1 = ObjectFactory.GetNamedInstance<IFoo>("Foo1");
var defaultFoo = ObjectFactory.GetInstance<IFoo>();

Debug.Assert(!Object.ReferenceEquals(foo1, defaultFoo));

这里的命名实例和默认实例是不同的

您在 StructureMap 注册中传递的是类型而不是对象(将被视为单例)?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-11
    • 1970-01-01
    • 2015-10-26
    • 2013-09-12
    • 2015-04-29
    • 1970-01-01
    相关资源
    最近更新 更多