Надежная система плагинов C # - PullRequest
1 голос
/ 22 мая 2010

Я пишу инструмент, который взаимодействует с несколькими системами контроля версий, либо subversion, либо clearcase, и имеет различные утилиты, которые можно подключить к нему.Хотя я использовал MEF для загрузки провайдеров контроля версий и утилит, оба из которых имеют определенные интерфейсы для них.

Я начал использовать MEF для этого.Но если загрузка какого-либо плагина не удалась (на половине моих клиентских компьютеров привязки ClearCase COM не будут присутствовать, поэтому загрузка не удастся, а на другой половине SVN не будет установлена, поэтому плагин SVN не будет загружаться),MEF выдает исключение и плагин не работает;Я надеялся, что остальные плагины загрузятся.

    [ImportMany(AllowRecomposition = true)]
    public IEnumerable<IVersionControl> RegisteredProviders { get; private set; }

Вместо этого, если какой-либо провайдер не сможет создать себя, тогда RegisteredProviders будет нулевым.

Есть ли простой способнастроить MEF для достижения этой цели (сообщать об исключениях, но загружать другие экземпляры), или мне нужно изменить интерфейс, чтобы отложить ошибку инициализации до тех пор, пока MEF не создаст экземпляры объектов?

1 Ответ

2 голосов
/ 23 мая 2010

Это зависит от того, когда именно выдается исключение. Вы можете получить желаемое, изменив свой импорт на следующее:

[ImportMany(AllowRecomposition = true)]
public IEnumerable<Lazy<IVersionControl>> RegisteredProviders { get; private set; }

Это может задержать исключение до тех пор, пока вы не получите доступ к свойству Value объекта Lazy.

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

...