Загрузка типов, которые наследуют определенный интерфейс из сборок в bin - PullRequest
1 голос
/ 12 января 2012

Я работаю над кодом для приложения 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() в каждом экземпляре для наиболее эффективного способа выполнения этого шага?

1 Ответ

0 голосов
/ 12 января 2012

Вы можете очистить код, но без каких-либо библиотек расширений код не станет намного короче.

Что касается производительности, я бы не особо беспокоился об оптимизации задач OnApplicationStarted, в частности, мы надеемся, что он вызывается не так часто и не должен влиять на ваш сайт после его запуска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...