Как я могу динамически загружать и выгружать сборки .Net внутри службы WCF? - PullRequest
0 голосов
/ 09 мая 2011

Я хочу разработать веб-службу wcf, работающую под управлением Windows, которая будет вести себя как служба управления выполнением задач и создания отчетов. Каждая задача будет представлена ​​как сборка .net, имя задачи и путь к DLL будут в центральной конфигурации. Задача в первую очередь должна содержать метод Execute и Stop, как минимум. Должна быть возможность загружать, выполнять, останавливать и выгружать задачи во время работы службы wcf и других задач. Один экземпляр каждой задачи может быть запущен одновременно. Одна задача, имеющая исключение, не должна прерывать другие задачи. Я думаю о таких методах, как

[OperationContract]    
bool Load(string taskName);
[OperationContract]
bool Run(string taskName);

Я думаю о том, как я могу выполнить задачи загрузки и выгрузки по требованию, а также изоляции. Некоторые параметры будут использовать Reflection, MAF (System.Addin) и т. Д. Начальный удар по производительности для загрузки является приемлемым, так как эта загрузка / выгрузка будет происходить очень редко.

Каков наилучший способ (библиотека, API, Framework и т. Д.) Для достижения этой цели.

Ответы [ 2 ]

1 голос
/ 09 мая 2011

Не могу сказать о лучшем, но ЕДИНСТВЕННЫЙ (!) Подход включает в себя несколько доменов приложений. Поскольку вы НЕ можете выгружать сборку, только домен приложения, поэтому все сборки, принадлежащие задаче, должны быть загружены в отдельный домен приложения.

Это технически очень тривиально. Дьявол кроется в деталях. MAF может быть хорошей основой для этого.

0 голосов
/ 09 мая 2011

Я бы просто определил интерфейс, который должна реализовывать каждая поставляемая сборка.

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

Я ценю, что это не совсем то, что вам нужно, но, надеюсь, это укажет вам правильное направление - надеюсь, это поможет:)

        var processingModules = from mod in
                                   AppDomain.CurrentDomain.GetAssemblies().SelectMany(assembly =>
                                   {

                                       return from t in assembly.GetTypes()

                                              where 
                                                    t.GetInterfaces().Contains(typeof(IProcessingModule<T>))
                                                    && t.GetConstructor(Type.EmptyTypes) != null
                                                    && t.GetCustomAttributes(typeof(ProcessModuleAttribute), true)
                                                           .Cast<ProcessModuleAttribute>()
                                                           .Select(e => e.Processes.Contains(manager.Name))
                                                           .Contains(true)

                                              select Activator.CreateInstance(t) as IProcessingModule<T>;
                                   })
                                   orderby mod.ModuleOrder
                                       select mod;
...