Лучший подход к расширяемости типов узлов и контекстных действий в древовидной структуре форм - PullRequest
1 голос
/ 31 мая 2009

Я работаю над надстройкой Visual Studio для Visual Studio 2008, которая отображает древовидную структуру, которая обеспечивает представление содержимого в серверном продукте. Серверный продукт содержит различные типы узлов, и каждый узел имеет свой собственный тип контекстного меню (контекстное меню).

Для новых типов узлов и действий, связанных с узлом, я в настоящее время просто добавляю код два моего проекта. Я хотел бы отключить мои типы узлов и действия, доступные на узле, в таком количестве, что я могу добавить узлы и записи в контекстное меню с помощью модели плагинов. MEF, вероятно, будет хорошим кандидатом. У кого-нибудь есть хорошая идея о том, как реализовать это простым и понятным способом, чтобы, в частности, разработчик плагинов не выполнял много сантехники?

1 Ответ

1 голос
/ 01 июня 2009

Я бы предоставил общую библиотеку, на которую ссылаются и ваш код, и библиотеки плагинов (назовите это зависимостью Контракта). Там определите интерфейс для типа узла, например, INodeType. Также рассмотрите возможность реализации там AbstractNodeType, который реализует INodeType и предоставляет некоторые полезные свойства, которые автор плагина может установить в своем конструкторе.

Одним из свойств INodeType является свойство ContextMenu, которое возвращает контекстное меню форм Windows.

В вашем коде укажите недвижимость:

[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 ... */
}

Надеюсь, я не ошибся в синтаксисе, но это общая идея.

...