Моя проблема в том, что мне нужно добавить возможность расширения чего угодно, от простых хуков которые поменяют порядок пунктов в контекстном меню до новых классов-наследников которые добавляют функционал, даже дать возможность одним расширениям регистрировать в себе другие расширения
Пока я придумал вот что, есть класс FactoryManager
public static class FactoryManager {
public static ConcurrentDictionary<string, IExtension> extensionsObjects { get; private set; } = new();
public static bool AddExtension(IExtension extension) {
return extensionsObjects.TryAdd(extension.name, extension);
}
}
В который все, кто хотят оповестить мир о том, что их можно как-то расширить регистрируют свой класс от IExtension и добавляют в FactoryManager
public interface IExtension {
public string name { get; }
}
(Это действительно весь код, все на столько обобщенное, что добавить больше особо нечего)
В IExtension каждый делает, что хочет, создает класс с event для хуков, или подразумевает, что класс по какому-то методу типо GetExtension() вернет класс-наследник, который нужный модуль зарегистрирует у себя
В итоге выходит, что каждая отдельная модульная часть приложения реализует внутри себя систему расширений, а после регистрирует эту систему в FactoryManager
Что смущает меня в этом подходе - в IExtension может быть все, что угодно, чтобы позволить модульность всего, что угодно, и таким образом при написании интерфейса ты должен знать заранее все об этом классе, к какому классу сделать каст и т.п.
По этому вопрос, это единственный путь? Или можно сделать как-то иначе?