@Drottarutarnum
Любопытный любитель

Как добавить возможность расширений в приложение?

Моя проблема в том, что мне нужно добавить возможность расширения чего угодно, от простых хуков которые поменяют порядок пунктов в контекстном меню до новых классов-наследников которые добавляют функционал, даже дать возможность одним расширениям регистрировать в себе другие расширения

Пока я придумал вот что, есть класс 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 может быть все, что угодно, чтобы позволить модульность всего, что угодно, и таким образом при написании интерфейса ты должен знать заранее все об этом классе, к какому классу сделать каст и т.п.

По этому вопрос, это единственный путь? Или можно сделать как-то иначе?
  • Вопрос задан
  • 52 просмотра
Пригласить эксперта
Ответы на вопрос 1
@joyrax-dev
будет полезно

Не обязательно делать с помощью интерфейсов, можно использовать обычный класс с виртуальными методами, которые можно будет пере определить не теряя зарание заложеной логики.
У дополнений или плагинов должно быть обобщеное api, то есть методы зарание известны приложению (то что я выше рассказывал).
Например, класс PluginBase, с методами virtual Update, virtual Draw, ты можешь в них заложить свою логику. А вот когда комьюнити или кто-то ещё будет делать свой плагин, он сможет как воспользоваться твоей версией метода, так и пере определить, ну ещё то и то одновременно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы