2012-01-04 4 views
4

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

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

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

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

Я пропустил некоторые вещи о MEF?

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

Интерфейсы Сборочные:

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

    public interface IClass2 
    { 
     void Trigger(); 
    } 

    public interface IClass3 
    { 
     void Trigger(); 
    } 
} 

Ассамблея Library1:

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

     #region IClass1 Members 

     public void Trigger() 
     { 

     } 

     #endregion 
    } 
} 

Ассамблея Library2:

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 были составлены.

Почему [Import] в Class3 не удовлетворены? Я думаю, что мне что-то не хватает ...

Спасибо вам за помощь!

Майкл

ответ

3

, пока class3 НЕ инстанцирован на MEF вы не увидите никакого импорта.

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

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

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(); 
    } 
} 
+0

Ahh ОК - в противном случае я бы использовать SatisfyImportsOnce - правильно? – Michael

+0

Почему вы не объявляете class3 в качестве экспорта и пусть MEF создает экземпляр класса3? если вы не хотите, чтобы вам нужен экземпляр CompositionContainer в вашем классе3, но я не думаю, что вам нужно – blindmeis

+0

ОК - и как мне получить экземпляр класса3? – Michael

Смежные вопросы