NopCommerce为了支持插件功能,以及支持一些自动注册的功能。系统提供了类型查找器。ITypeFinder以及实现类就是提供此功能。通过类型查找器可以查找本程序域中的类,也可以查找整个bin目录下所有动态链接库中类,并把它们注册到类型反转容器中。ITypeFinder以及实现类如下:
/// <summary> /// Classes implementing this interface provide information about types /// to various services in the Nop engine. /// </summary> public interface ITypeFinder { IList<Assembly> GetAssemblies(); IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, bool onlyConcreteClasses = true); IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true); IEnumerable<Type> FindClassesOfType<T>(bool onlyConcreteClasses = true); IEnumerable<Type> FindClassesOfType<T>(IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true); }
FakeTypeFinder(模拟类型查找器)
/// <summary> /// 模拟类型查找 /// </summary> public class FakeTypeFinder : ITypeFinder { public Assembly[] Assemblies { get; set; } public Type[] Types { get; set; } public FakeTypeFinder(Assembly assembly, params Type[] types) { Assemblies = new[] { assembly }; this.Types = types; } public FakeTypeFinder(params Type[] types) { Assemblies = new Assembly[0]; this.Types = types; } public FakeTypeFinder(params Assembly[] assemblies) { this.Assemblies = assemblies; } public IList<Assembly> GetAssemblies() { return Assemblies.ToList(); } public IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, bool onlyConcreteClasses = true) { return (from t in Types where !t.IsInterface && assignTypeFrom.IsAssignableFrom(t) && (onlyConcreteClasses ? (t.IsClass && !t.IsAbstract) : true) select t).ToList(); } public IEnumerable<Type> FindClassesOfType<T>(bool onlyConcreteClasses = true) { return FindClassesOfType(typeof(T), onlyConcreteClasses); } public IEnumerable<Type> FindClassesOfType(Type assignTypeFrom, IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true) { return FindClassesOfType(assignTypeFrom, onlyConcreteClasses); } public IEnumerable<Type> FindClassesOfType<T>(IEnumerable<Assembly> assemblies, bool onlyConcreteClasses = true) { return FindClassesOfType(typeof(T), onlyConcreteClasses); } }