основанные на плагинах приложения с плагинами, которые модифицируют другие плагины - PullRequest
2 голосов
/ 19 февраля 2011

Я смотрю на то, как создавать модульные приложения на основе плагинов в C #. Я читаю о Prism и MEF (которые я уже использовал в некоторых моих проектах).

Все примеры и статьи, которые я нашел, говорят о дискретных модулях. Мой вопрос как раз об этом. Предположим, что один из модулей не предоставляет новых представлений, но ему «просто» необходимо изменить существующее представление, которое предоставляется другим модулем, путем добавления одного или нескольких полей и некоторой дополнительной логики. Как бы Вы это сделали?

Будет ли правильным во время компоновки проверить, какие другие части присутствуют в каталоге, и программно изменить их?

Я могу думать об этом как о возможном решении, если есть «модуль 1» и «модуль 2», который что-то меняет в «модуле 1». Но если сценарий становится намного более сложным? например, если у нас есть базовый «модуль 1», который должен быть изменен «модулем 2» и «модулем 3», но также существует «модуль 4», который изменяет пользовательский интерфейс и логику, предоставляемые «модулем 2», и так далее ...?

Не могли бы вы дать мне совет, как это можно реализовать?

Заранее спасибо,

Приветствия

Джанлука

Ответы [ 2 ]

1 голос
/ 19 февраля 2011

Из вашего примера я делаю вывод, что у вас есть экспорт, который выглядит примерно так, для чего вы делаете [ImportMany] где-то:

[Export(typeof(IView))]
public class BarView : IView
{
    ...
}

Предположим, что одна конкретная реализация представления должна быть подключаемой. Тогда вы могли бы сделать что-то вроде этого:

[Export(typeof(IView))]
public class FooView : IView
{
    [ImportMany(IFooViewPlugin)]
    public IEnumerable<IFooViewPlugin> Plugins { get; set; }

    ...
}

Конечно, вам все еще нужно сформировать IFooViewPlugin и решить, как FooView вызывает его, чтобы настроить себя. Это зависит от того, какие настройки вы имели в виду.

0 голосов
/ 19 февраля 2011

Вы можете сделать так, чтобы хост-приложение выставляло коллекцию плагинов через, скажем, свойство «Плагины». Затем ваш плагин может перебирать коллекцию плагинов, пока вы не найдете нужный тип, а затем не измените его.

В целях безопасности вы можете добавить тестовый код в изменяемый плагин (скажем, установить пароль), чтобы предотвратить изменение нежелательными плагинами.

...