1

对于覆盖/替换类型注册,两个框架都使用“最后一次注册获胜”。然而,对于集合(同一接口的多个实现),在两个框架中,集合都被添加到,永远不会完全覆盖/替换为新集合:

For<IService>().Use<Service1>();
For<IService>().Use<Service2>();
GetInstance<IEnumerable<IService>>() == IEnumerable[Service1, Service2]

// Overriding in child container/profile or Autofac tenant
For<IService>().Use<Service3>();
GetInstance<IEnumerable<IService>>() == IEnumerable[Service1, Service2, Service3]

// Even if I use StructureMap's ClearAll
For<IService>().ClearAll().Use<Service3>();
GetInstance<IEnumerable<IService>>() == IEnumerable[Service1, Service2, Service3]

我的期望是,当涉及到多个实现(即集合)时,我应该能够使用某些东西来清除或替换父注册,以便我可以在父/全局和子/租户中保留特定服务的单独列表.

(我知道 StructureMap 不再维护,我愿意切换到另一个框架)。

4

2 回答 2

1

Simple Injector允许替换整个集合:

var container = new Container();

// Register NullLogger and SqlLogger as a collection of ILogger instances
container.Collection.Register<ILogger>(typeof(NullLogger), typeof(SqlLogger));

// Enable overriding registrations (without setting this, Simple Injector will throw)
container.Options.AllowOverridingRegistrations = true;

// Replace the complete collection of loggers with two different loggers
container.Collection.Register<ILogger>(typeof(ConsoleLogger), typeof(MailLogger));
于 2019-12-05T14:16:44.640 回答
1

无法从 Autofac 中删除注册。

无论如何,我可以看到 3 个解决方法:

  1. 您可以创建一个新的ContainerBuilder并复制所需的注册。

    请参阅是否可以从 Autofac 容器构建器中删除现有注册?

  2. 你可以自己注册IEnumerable<T>

    builder.Register(c => new IService[] { c.Resolve<Service1>() })
           .As<IEnumerable<IService>>(); 
    
  3. 您可以创建自己的IRegistrationSourceforIEnumerable<T>并过滤请求的类型

于 2019-12-05T21:24:03.030 回答