Я работаю над кодом для приложения ASP.NET MVC, который будет выполнять следующие действия при запуске приложения:
- Загрузка всех сборок в каталог bin приложения
- Получить все типы из каждой сборки, которые получены из интерфейса (
ITask
)
- Вызовите метод
Execute()
для каждого типа
Вот текущая идея, с которой я пришел. Этот метод будет вызван в OnApplicationStarted()
:
private void ExecuteTasks()
{
List<ITask> startupTasks = new List<ITask>();
Assembly asm = this.ExecutingAssembly;
// get path of executing (bin) folder
string codeBase = this.ExecutingAssembly.CodeBase;
UriBuilder uri = new UriBuilder(codeBase);
string path = Uri.UnescapeDataString(uri.Path);
string bin = Path.GetDirectoryName(path);
string[] assemblies = Directory.GetFiles(bin, "*.dll");
foreach (String file in assemblies)
{
try
{
if (File.Exists(file))
{
// load the assembly
asm = Assembly.LoadFrom(file);
// get all types from the assembly that inherit ITask
var query = from t in asm.GetTypes()
where t.IsClass &&
t.GetInterface(typeof(ITask).FullName) != null
select t;
// add types to list of startup tasks
foreach (Type type in query)
{
startupTasks.Add((ITask)Activator.CreateInstance(type));
}
}
}
catch (Exception ex)
{
Exceptions.LogException(ex);
}
}
// execute each startup task
foreach (ITask task in startupTasks)
{
task.Execute();
}
}
Мой вопрос: есть ли лучший способ выполнить какой-либо из этих шагов? Метод получения каталога bin был взят из этого ответа: https://stackoverflow.com/a/283917/213159. Кажется, много работы сделать что-то простое, но я не мог придумать более легкий подход.
Кроме того, используется ли System.Activator
для создания экземпляров и последующего вызова метода Execute()
в каждом экземпляре для наиболее эффективного способа выполнения этого шага?