从解决方案文件夹加载所有提供程序类

给定一个支持不同逻辑提供程序的.net应用程序,如何在解决方案文件夹中实例化每个类的一个实例? 迭代文件夹中所有类的方法是什么?

例如,我的解决方案中有一个名为MailClientProviders的文件夹,它包含Outlook和The Bat! 实现IMailProvider接口的提供程序类。

在我的App.xaml中,我调用Ninject容器来初始化所有依赖项。 然后我需要编写一个我将调用的方法,并将获得返回的每个类的实例。

 heartbeatService.Providers = CreateOneInstanceOfAllClassesInProvidresDir(MailClientProviders); 

CreateOneInstanceOfAllClassesInProvidresDir方法中CreateOneInstanceOfAllClassesInProvidresDir什么?

我使用这些函数来检索实现我的自定义接口的文件夹中的所有类:

 public static List GetFilePlugins(string filename) { List ret = new List(); if (File.Exists(filename)) { Type typeT = typeof(T); Assembly ass = Assembly.LoadFrom(filename); foreach (Type type in ass.GetTypes()) { if (!type.IsClass || type.IsNotPublic) continue; if (typeT.IsAssignableFrom(type)) { T plugin = (T)Activator.CreateInstance(type); ret.Add(plugin); } } } return ret; } public static List GetDirectoryPlugins(string dirname) { List ret = new List(); string[] dlls = Directory.GetFiles(dirname, "*.dll"); foreach (string dll in dlls) { List dll_plugins = GetFilePlugins(Path.GetFullPath(dll)); ret.AddRange(dll_plugins); } return ret; } 

所以你可以运行GetDirectoryPlugins并在发现的每个类中使用Activator.CreateInstance

Directory.GetFiles("MailClientProviders", "*.dll")用于获取文件夹内的所有dll,然后是Assembly.LoadFrom用于每个返回的结果和每个程序集Assembly.GetTypes获取所有公共类型以及每种类型检查它是否实现所需的接口,如果它执行Activator.CreateInstance来实例化它。