c# - 同一类型的多个实例

标签 c# dependency-injection inversion-of-control structuremap

使用 StructureMap,假设我为给定接口(interface)配置了几个实例,由名称标识:

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 实例,容器为任何命名请求提供该实例。

有没有办法告诉它构造和使用不同的实例,即使它们是相同的具体类型?

最佳答案

这不是我看到的行为:

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 注册中传递的是类型而不是对象(这将被视为单例)?

关于c# - 同一类型的多个实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16836929/

相关文章:

c# - HttpPostAttribute 中 Name 参数的用途是什么

c# - 在 Entity Framework Core 中创建迁移时如何配置 DbContext?

java - Spring Boot 具有更多上下文

.net - 项目嵌入式 IoC 容器

spring - 在spring中覆盖bean配置

java - 在 Selenium Webdriver 中处理多页表

c# - 按内部列表的属性计数对 List<T> 进行排序

c# - 使用线程连续检查值的更改

php - 克隆依赖项的副本(依赖注入(inject))是否有意义?

unit-testing - 单元测试 IoC 注册?