CompositionContainer
- это класс, который фактически составляет ваши части в MEF.
Когда вы хотите использовать MEF, вам нужно всегда составлять часть, которая приписана определениям импорта. Если у вас есть свойство в Form1
, помеченное [Import(typeof(ILogger))]
, в какой-то момент вам необходимо создать ваш экземпляр Form1.
CompositionContainer
- это класс, который фактически выполняет эту композицию. Он находит соответствующий экспортированный ILogger
на основе каталогов, содержащихся в контейнере, и создает типы, сопоставляет экспорт с импортом и т. Д.
Причина, по которой сэмплы MEF "составляют" только один раз, заключается в том, что часто с DI у вас будет один экземпляр контейнера, созданный и настроенный в начале приложения, и он будет составлять ваш "главный" " окно. Все остальные классы будут составлены автоматически, если они используются как часть главного окна. (Например, если Form1 составляет ILogger, но ваша реализация ILogger имеет собственный [Import]
, он также будет скомпонован на этом этапе.)
При этом не существует фиксированного правила, определяющего, что вы не можете сочинять более одного раза. Например, в WPF и Silverlight часто MEF не может создать ваш объект, что означает, что он не может автоматически составить ваш объект для вас. В этих ситуациях распространенным шаблоном является использование CompositionInitializer (в поле в Silverlight, а не на рабочем столе), чтобы составлять части самостоятельно, основываясь на статическом каталоге. Недавно я писал в блоге об этом подходе для WPF .
В Windows Forms это может быть менее необходимо, поскольку не существует стороннего продукта (анализатор XAML), создающего ваши типы. Тем не менее, вы можете использовать этот же подход, если захотите.