Как зарегистрировать типы в сборках, которые не были загружены с Unity? - PullRequest
0 голосов
/ 12 октября 2011

Я хочу загрузить все типы интерфейса, чтобы я мог вызвать метод для него. Тем не менее, сборки не ссылаются на время компиляции. Они будут в папке с корзиной.

Это то, что я могу легко сделать с Unity?

Например, у меня есть код вроде:

using (var container = new UnityContainer())
        {
            container.RegisterType<IModule>();

            var modules = container.ResolveAll(typeof(IModule));

            foreach (IModule module in modules) { module.Logon(); }

            Console.WriteLine("Done...");
            Console.ReadLine();
        }

Конечно, модули не разрешаются ни к чему, потому что сборки были просто помещены в папку bin. На них нет статической ссылки в моей текущей сборке.

Или я должен выполнить какой-либо тип сборок. Загрузка (). Я бы хотел, чтобы это было как можно более динамичным. Мне не нужно указывать имена сборок в конфигурационном файле или коде, если это возможно.

Заранее спасибо.

1 Ответ

3 голосов
/ 13 октября 2011

Unity сама по себе не загружает никакие сборки. Он работает с объектами Type и позволяет CLR загружать эти типы по своему усмотрению.

Чтобы выполнить динамическое обнаружение так, как вы хотите, вам нужно написать небольшой код, чтобы прокрутить сборки в каталоге bin, загрузить их в память, а затем прокрутить их в поисках интересующих вас типов. Это довольно тривиально, если вы знакомы с API отражений.

Вот некоторый код, который вы можете использовать для циклического перемещения по каталогу bin и проверки загрузки каждой сборки:

    private static bool ForceLoadAssemblies()
    {
        foreach (var fileName in Directory.GetFiles(AppDomain.CurrentDomain.RelativeSearchPath, "*.dll"))
        {
            string assemblyName = Path.GetFileNameWithoutExtension(fileName);
            if (assemblyName != null)
            {
                Assembly.Load(assemblyName);
            }
        }
        return true;
    }

Другой вариант - вместо этого посмотреть на MEF. MEF был явно разработан для случая динамического обнаружения, в то время как Unity больше построена на внутреннем управлении зависимостями.

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