Простой плагин с MEF. Как я могу загрузить плагин с помощью файла конфигурации - PullRequest
1 голос
/ 05 августа 2010

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

Есть ли какой-нибудь пример, который использует Mef и файл конфигурации?

Все, что мне нужно, это как настроить mef в конфигурационном файле, возможно ли это? Это небольшой пример, который я создал, чтобы протестировать его. Мне не хватает функции loadPlugin и файла конфигурации. Можете ли вы помочь

Пример Noddy

                       //MyCompany.Payment.Contracts.dll

        public interface IPayment
        {
            bool Pay();
        }
        //MyCompany.Payment.ServiceProviderOne.dll
          [Export(typeof(IPayment))]
        public class ServiceProviderOne:IPayment
        {
            public bool Pay(return true);
        }
        //MyCompany.Payment.ServiceProviderTwo.dll
          [Export(typeof(IPayment))]
        public class ServiceProviderTwo:IPayment
        {
            ?public bool Pay(return true);
        }

        //Main Console.Applicaiton
        class Program
            {
                static void Main(string[] args)
                {
                    HelperPlugin helperPlugin =new HelperPlugin();
                    List<IPayment> myLoadedPayments= helperPlugin.GetPlugins();

                    //blahhh conti
                }
            }

            public cass HelperPlugin
            {
                [ImportMany(typeof(IPayment))]
                public List<IPayment>Payments { get; set; }

                public List<IPayment>GetPlugins()
                {
                    Payments=new List<IPayment>();
                    LoadPlugins();

                    return Payments;
                }

                private void LoadPlugins()
                {
                 ???
                }
            }

Файл конфигурации Как это выглядит?

Спасибо за любые предложения или фрагменты кода

Ответы [ 2 ]

1 голос
/ 06 октября 2011

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

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

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

1 голос
/ 05 августа 2010

Я сейчас работаю над похожей проблемой, и мой подход такой:

  • Я планирую иметь конфигурационный файл, который определяет, как мой CompositionContainer будет настроен
  • Моя конфигурация должна содержать список каталогов для сканирования контейнера (используя DirectoryCatalog для каждого указанного каталога)
  • и мой конфиг также должен поддерживать список сборок, которые могут храниться в другом месте, и это будет включено, если для этой цели использовать несколько AssemblyCatalog

В общем, я пытаюсь настроить отдельные каталоги, из которых состоит мой AggregateCatalog, который будет использоваться контейнером композиции для поиска деталей. К сожалению, пока нет, так что пока это просто у меня в голове - пока нет кода.

...