Использование C # MEF со статическими классами - PullRequest
11 голосов
/ 09 января 2012

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

[Import(typeof(A))]
    static private A _a1;

Затем у меня есть метод, которому я передаю имя сборки в качестве аргумента:

    public static A LoadPackage(string filePath)
    {
            var catalog = new AggregateCatalog();
            catalog.Catalogs.Add(new AssemblyCatalog(filePath));
            var _container = new CompositionContainer(catalog);
            ???
    }

Итак, есть ли способ импортировать тип из сборки, указанной в filepath?

Я не могу сделать:

_container.ComposeParts(this);

, поскольку класс `static и я не могу это сделать

_container.ComposeParts(_a1);

(что может быть неправильно с самого начала), поскольку A не имеет конструкторов (поэтому _a1 имеет значение null)

Ответы [ 2 ]

12 голосов
/ 09 января 2012

MEF предназначен для создания и инициализации объектов для вас. Он не имеет отношения к состоянию в статических классах.

Я предлагаю вам сделать класс и его поля нестатическими и пометить его как [PartCreationPolicy(CreationPolicy.Shared)], если вы хотите применить одноэлементное поведение.

См. Также этот другой вопрос о MEF и шаблоне синглтона.

9 голосов
/ 12 января 2012

Что ж, получается, что метод, который я искал, это GetExportedValue (да, я пропустил основные функции):

static private A _a1;

public static A LoadPackage(string filePath)
{
        var catalog = new AggregateCatalog();
        catalog.Catalogs.Add(new AssemblyCatalog(filePath));
        var _container = new CompositionContainer(catalog);
        _a1 = _container.GetExportedValue<A>();
}

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

...