Imagine um cenário em que nosso sistema de serviços forneça uma série de serviços funcionais, e mais novos serviços funcionais serão adicionados no futuro, e serviços funcionais podem precisar ser alterados ou removidos. Um requisito básico comum para esse tipo de sistema de serviços é que a operação do sistema de serviço não possa ser interrompida ao adicionar/remover/atualizar serviços funcionais. Normalmente, "hot-swapping plugins" podem ser implementados muito facilmente encapsulando cada serviço em uma DLL de plugins, mas a "hot replacement" ("substituição dinâmica") dos plugins se torna um problema. O motivo é que, quando desinstalamos um plugin DLL do sistema de serviço, o sistema de serviço ainda mantém a referência subjacente à DLL, e se você tentar deletar ou sobrescrever a DLL, o Windows vai mostrar uma mensagem como "a DLL está sendo usada".
Então, como resolver esse problema? Acho que existem pelo menos duas opções:
(1) Use AppDomain. Carregar plugins em um novo AppDomain e depois desinstalar o AppDomain descarrega limpamente os plugins DLLs do sistema de serviço. O lado negativo dessa abordagem é que você precisa gerenciar muitos AppDomains (porque você tem muitos serviços funcionais), e a comunicação entre os AppDomaines é feita de forma remota, o que traz muitas dores de cabeça desnecessárias ao nosso sistema. Se você tiver interesse, também pode tentar essa opção, e eu prefiro usar a segunda.
(2) Copiar o plugin Dll na memória e então carregar o Dll na memória. Dessa forma, as DLLs do disco rígido podem ser sobrescrevidas ou excluídas à vontade. Anteriormente, carregávamos o plugin Dll diretamente do disco rígido, assim:
Agora, precisamos virar a página:
Isso resolve o problema da "substituição dinâmica" dos plugins.
|