Я думаю, подходят ли WeakReferences и WeakEvents в случае интерфейса серверных модулей. Может быть, это хороший дизайн?
Но вопрос также в производительности, безусловно, требуется Invoke в шаблоне WeakEvent и доступ к WeakReference, возможно, тоже
ОБНОВЛЕНИЕ: подробности
СЕРВЕР:
- есть менеджер модулей,
- может загружать/выгружать классы реализации DLL с общим интерфейсом, IModule,
- поэтому диспетчер модулей создает и хранит экземпляры IModule,
Модули:
- иметь имя или уникальный код,
- необходимо взаимодействовать с другими модулями, использовать их методы, свойства, события,
Проблема в том, что когда модуль получает экземпляр другого модуля (предоставленного по имени, например, из диспетчера модулей), то с этого момента нет гарантии, что модуль может быть когда-либо собран мусором перед выгрузкой.
Но может быть общий класс (WeakRefModule, где T: IModule) данной реализации IModule, ограниченный IModule, который может внутренне хранить WeakReference в IModule. И тогда данный модуль будет раскрывать свои общедоступные методы с помощью методов расширений или наследования на основе WeakRefModule. Скрытие экземпляра модуля за WeakReference. То же самое со свойствами и событиями (WeakEvents).
Такие модули всегда будут гарантировать, что другой модуль не сможет помешать сборке мусора.
Итак, вопрос в том, насколько это хороший дизайн и могут ли быть какие-то скрытые проблемы?