我正在使用 Autofac 来处理我的应用程序中的依赖注入。为了不必明确地进行每一次注册,我首先使用RegisterAssemblyTypes().AsImplementedInterfaces()
然后只处理那些需要特别配置的。
我有一个名为的接口IToolStripPopulator
,它有几个不同的实现,其中几个正在使用,但有些不再使用(因为我正在努力工作并遵守 OCP,如果我需要不同的功能,我通常不会更改它们,而是不要管它们,然后创建新的来满足我现在的需要)。出于这个原因,我需要通过两种方式覆盖接口的自动注册:
- 一种实现是注入到我的主要逻辑中,并充当其他一些实现的装饰器。我自然希望通过它注册
As<IToolStripPopulator>()
并完成它,因为这是我的应用程序功能当前依赖的实现。 - 那些其他实现是仅在该装饰器类中使用的“内部”填充器。要注入它们,有两种方法:
- 使用特定类型显式连接外部实现的构造函数;这不是很好,还因为该构造函数必须采用我现在正在使用的内部填充器的确切数量,这不符合 OCP。
- 让外部实现采用
IEnumerable<IToolStripPopulator>
; 这是我想做的,但这也是我卡住的地方。
我不能让 AutofacIEnumerable
自己解决这个问题,因为它只会解决接口的所有实现,即使是我不再使用的接口以及我不想要的“外部”(以及可能会在解析过程中导致无限循环)。
所以我想做的是:
// the inner populators
builder.RegisterType<BrowsersMenuPopulator>().Named<IToolStripPopulator>("inner");
builder.RegisterType<ThreadsafeConnectionMenuPopulator>().Named<IToolStripPopulator>("inner");
// the decorator implementation
builder.RegisterType<BrowserAndConnectionMenuPopulator>().As<IToolStripPopulator>().WithParameter( ? );
但此时无法实际访问现有注册。