MEF и AssemblyCatalog / AggregateCatalog - PullRequest
       34

MEF и AssemblyCatalog / AggregateCatalog

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

У меня есть простое консольное приложение, как показано ниже (для простоты удален несоответствующий код)

    [ImportMany(typeof(ILogger))]
    public IEnumerable<ILogger> _loggers {get;set;}

    public interface ILogger
    {
        void Write(string message);
    }

    [Export(typeof(ILogger))]
    public class ConsoleLogger : ILogger
    {
        public void Write(string message)
        {
            Console.WriteLine(message);
        }
    }

    [Export(typeof(ILogger))]
    public class DebugLogger : ILogger
    {
        public void Write(string message)
        {
            Debug.Print(message);
        }
    }

Код для инициализации каталога приведен ниже

(1) var catalog = new AggregateCatalog();
(2) catalog.Catalogs.Add(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory));
(3) //var catalog = new AssemblyCatalog(Assembly.GetExecutingAssembly());

var container = new CompositionContainer(catalog);
var batch = new CompositionBatch();
batch.AddPart(this);
container.Compose(batch); 

Если каталог инициализирован через строки 1-2, в _logger ничего не загружалось Если каталог инициализируется через строку 3, оба регистратора загружаются в _logger

В чем проблема с подходом AggregateCatalog?

Спасибо

Ответы [ 2 ]

0 голосов
/ 20 февраля 2012

Я нашел проблему.

Похоже, что DirectoryCatalog (путь) ищет только в DLL по умолчанию, а моя тестовая программа была консольным приложением. И экспорт был в EXE (не DLL), поэтому они не были загружены.

С другой стороны, AssemblyCatalog (Assembly.GetExecutingAssembly ()), очевидно, загружает экспорт из текущей сборки (которая является EXE).

Решение - использовать другой конструктор DirectoryCatalog (path, searchPattern) и использовать «*. *» Для второго параметра. И это работает

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

Он должен работать так, как вы его используете.

Однако в строке 2 вы создаете DirectoryCatalog, а в строке 3 - AssemblyCatalog.Работает ли это должным образом, если вы измените вторую строку на

catalog.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...