为什么先讲反射,因为ABP的模块管理基本就是对所有程序集进行遍历,再筛选出AbpModule的派生类,再按照以来关系顺序加载。
ABP对反射的封装着重于程序集(Assembly)与类(Type)。系统中分别定义了IAssemblyFinder与ITypeFinder两个接口,从命名上就可以看出这两个接口主要是用来进行程序集与类查找的。
IAssemblyFinder只提供了一个方法 GetAllAssemblies(),从IAssemblyFinder的实现类CurrentDomainAssemblyFinder可以看出这个方法的功能是获取当前应用程序域下所有的程序集。
public class CurrentDomainAssemblyFinder : IAssemblyFinder { /// <summary> /// Gets Singleton instance of <see cref="CurrentDomainAssemblyFinder"/>. /// </summary> public static CurrentDomainAssemblyFinder Instance { get { return SingletonInstance; } } private static readonly CurrentDomainAssemblyFinder SingletonInstance = new CurrentDomainAssemblyFinder(); public List<Assembly> GetAllAssemblies() { return AppDomain.CurrentDomain.GetAssemblies().ToList(); } }