我正在处理ASP.NET MVC应用程序的代码,该应用程序将在启动应用程序时执行以下操作:
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()
方法来执行该步骤的最有效方法吗?
答案 0 :(得分:0)
您可以清理代码,但是如果没有任何扩展库,代码就不会那么短。
关于性能,我不会过于担心优化OnApplicationStarted任务,特别是它不会经常被调用,并且一旦启动并运行就不会影响您的网站。