MEF: какова роль, срок службы и знания «контейнера»? - PullRequest
2 голосов
/ 05 апреля 2010

Я играю с MEF, и в примере я вижу этот код (я называю его кодом создания MEF):

var catalog = new AssemblyCatalog(System.Reflection.Assembly.GetExecutingAssembly());
var container = new CompositionContainer(catalog);
container.ComposeParts();

В большинстве примеров это делается в том же исходном файле, что и классы Startup Program, а также во всех других интерфейсах и классах.

Теперь я хочу использовать MEF, но мне интересно, что делает этот контейнер. Насколько я догадался, он выполняет сопоставление экспорта / импорта, но что, если у меня есть этот код (из приложения Windows Forms:

 [STAThread]
        static void Main()
        {
            Application.Run(new Form1());

        }

и в этой Form1 я хочу создать объект типа Auditer (у которого есть свойство типа ILogger, помеченное как import, и у меня есть класс, реализующий ILogger, помеченный как экспорт).

Должен ли я поместить код составления MEF в void Main (), в событие Load формы Form1 или в конструктор класса Auditer?

Я могу заставить его работать, только когда помещаю его (код составления MEF) в конструктор класса Auditer, но примеры, которые я читал, почему-то дают мне идею, что вам нужно вызывать код составления только один раз.

1 Ответ

2 голосов
/ 05 апреля 2010

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), создающего ваши типы. Тем не менее, вы можете использовать этот же подход, если захотите.

...