Наилучший подход к расширению типов узлов и контекстных действий в Forms treeview
-
06-09-2019 - |
Вопрос
Я работаю над надстройкой Visual Studio для Visual Studio 2008, которая отображает treeview, предоставляющий представление содержимого в серверном продукте.Серверный продукт содержит различные типы узлов, и каждый узел имеет свой собственный тип контекстного меню (меню, вызываемое правой кнопкой мыши).
Для новых типов узлов и действий, связанных с узлом, я в настоящее время просто добавляю код в свой проект.Я хотел бы отключить мои типы узлов и действия, доступные на узле, в таком количестве, чтобы я мог добавлять узлы и записи в контекстное меню с помощью модели плагина.МЭФ, вероятно, был бы хорошим кандидатом.У кого-нибудь есть хорошая идея о том, как реализовать это простым и понятный способом, чтобы разработчику плагинов не приходилось много возиться?
Решение
Я бы предоставил общую библиотеку, на которую ссылаются как ваш код, так и библиотеки плагинов (назовем это зависимостью контракта).Там определите интерфейс для типа узла, например INodeType .Кроме того, рассмотрите возможность реализации AbstractNodeType, который реализует INodeType и предоставляет некоторые полезные свойства, которые автор плагина может установить в своем конструкторе.
Одним из свойств INodeType является свойство ContextMenu, которое возвращает контекстное меню Windows forms.
В вашем коде создайте свойство:
[Import("NodeTypes", typeof(INodeType))]
public IEnumerable<INodeType> extensionNodeTypes { get; set; }
Вы можете просто перечислить это после того, как составите текст.
В коде плагина они объявляли бы новые типы узлов примерно так (возможно, не компилируются):
[Export("NodeTypes", typeof(INodeType))]
public class SomeNodeType : AbstractNodeType
{
public SomeNodeType()
{
this.ContextMenu = base.BuildContextMenu(/* ... */);
/* etc. */
}
/* ... other custom logic ... */
}
Я надеюсь, что я не перепутал синтаксис, но это общая идея.