Autofac:IEnumerable<IInterface> 将始终返回从 IInterface 派生的对象列表?

Gra*_*ton 3 c# dependency-injection autofac

我继承了一个相当大的代码库,其中大量使用了 Autofac。我发现了一些有趣甚至有点令人费解的事情。

我有一堂这样的课

public class ClassA
{  
   public ClassA(IEnumerable<IInterface> allObjects)
   {
   }
}
Run Code Online (Sandbox Code Playgroud)

在我的项目中,我有一些实现的类IInterface,例如

public class AInterface:IInterface {};
public class BInterface:IInterface {};
public class CInterface:IInterface {};
Run Code Online (Sandbox Code Playgroud)

有趣的是,如果我让 Autofac 实例化ClassA,那么对于allObjects参数,Autofac 会给我List<IInterface>(){AInterface, BInterface, CInterface}

看起来 Autofac 正在遍历应用程序域中加载的程序集中的所有类型,并自动实例化从IInterface.

这是有记录的行为吗?如果是的话,在哪里?尽管这完全按照我的预期工作,但我仍然希望确保它已记录并得到正式支持,这样我就不会依赖于未记录的(因此会受到更改)行为,而这些行为只是因为偶然而表现良好。

Jeh*_*hof 6

此行为记录在隐式关系类型中

例如,当 Autofac 注入类型的构造函数参数时,IEnumerable<ITask>它不会查找提供IEnumerable<ITask>. 相反,容器将找到它们的所有实现ITask并注入它们。