MEF импортирует ноль - PullRequest
       22

MEF импортирует ноль

4 голосов
/ 04 января 2012

Прежде всего: вы все великолепны, я очень часто ищу на этом сайте ответы MEF.

Моя проблема заключается в следующем:

У меня есть несколько сборок со многими [Imports] вих и одно основное приложение, где происходит сборка.Теперь проблема в том, что эти Imports не «заполняются», они всегда остаются нулевыми.

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

Неужели я неправильно понимаю некоторые вещи о MEF?

Пожалуйста, помогите!Спасибо всем!

Интерфейсы сборки:

namespace Interfaces
{
    public interface IClass1
    {
        void Trigger();
    }

    public interface IClass2
    {
        void Trigger();
    }

    public interface IClass3
    {
        void Trigger();
    }
}

Библиотека сборки1:

namespace Library1
{
    [Export(typeof(IClass1))]
    public class Class1:IClass1
    {

        #region IClass1 Members

        public void Trigger()
        {

        }

        #endregion
    }
}

Библиотека сборки2:

namespace Library2
{
    [Export(typeof(IClass2))]
    public class Class2:IClass2
    {
        [Import]
        public IClass1 Class1 { get; set; }

        public void Trigger()
        {
        }
    }
}

В основной программеЯ собираю весь материал Mef, выполняя следующее:

namespace MEFTest
{
    public class mefStart
    {
        public CompositionContainer Container { get; private set; }

        public void Start()
        {
            AggregateCatalog catalog = new AggregateCatalog();

            AssemblyCatalog assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);
            DirectoryCatalog directoryCatalog = new DirectoryCatalog(".", "Library*.dll");
            catalog.Catalogs.Add(directoryCatalog);
            catalog.Catalogs.Add(assemblyCatalog);

            this.Container = new CompositionContainer(catalog);

            CompositionBatch batch = new CompositionBatch();
            batch.AddExportedValue(this.Container);

            this.Container.Compose(batch);
            this.Container.ComposeParts(this);
        }
    }
}

Но после этого следующий класс не заполняет ни одного импорта:

namespace MEFTest
{
    public class Class3:IClass3
    {
        [Import]
        public IClass1 Class1 { get; set; }

        [Import]
        public IClass2 Class2 { get; set; }

        public void Trigger()
        {
            Class1.Trigger();
            Class2.Trigger();
        }
    }
}

Когда я смотрю в контейнерЯ вижу, что IClass1 и ICLass2 были составлены.

Почему [Импорт] в Class3 не выполняется?Наверное, я что-то упустил полностью ...

Заранее всем спасибо за помощь!

Майкл

1 Ответ

3 голосов
/ 04 января 2012

до тех пор, пока MEF не будет создан экземпляр class3, вы не увидите никакого импорта.

Кстати, если вы выполняете импорт не через [ImportingConstructor] - убедитесь, что импорт удовлетворен (IPartImportsSatisfiedNotification) перед их использованием.

это будет работать, но я не знаю, где вам нужен ваш класс3

public class mefStart
{
    [Import]
    private IClass3 my3;
    public CompositionContainer Container { get; private set; }

    public void Start()
    {
        AggregateCatalog catalog = new AggregateCatalog();

        AssemblyCatalog assemblyCatalog = new AssemblyCatalog(typeof(Program).Assembly);
        DirectoryCatalog directoryCatalog = new DirectoryCatalog(".", "Library*.dll");
        catalog.Catalogs.Add(directoryCatalog);
        catalog.Catalogs.Add(assemblyCatalog);

        this.Container = new CompositionContainer(catalog);

        CompositionBatch batch = new CompositionBatch();
        batch.AddExportedValue(this.Container);

        this.Container.Compose(batch);
        this.Container.ComposeParts(this);

        //from here you can use Class3 with all imports
    }
}

[Export(typeof(IClass3)]
public class Class3:IClass3
{
    [Import]
    public IClass1 Class1 { get; set; }

    [Import]
    public IClass2 Class2 { get; set; }

    public void Trigger()
    {
        Class1.Trigger();
        Class2.Trigger();
    }
}
...