MEF - Могу ли я создавать экземпляры и автоматически создавать их внутри MEF? - PullRequest
1 голос
/ 14 декабря 2010

Как я понимаю, чтобы атрибуты импорта / экспорта были правильно связаны друг с другом, мне нужно вызывать compositionContainerInstance.Compose(...) с каждым новым экземпляром, который имеет эти атрибуты.

Возможно ли иметь этопроисходит автоматически, поэтому мне не нужно делать это всякий раз, когда я создаю новый экземпляр некоторого компонуемого класса?

Это будет пример, хотя в целом он абстрагирует мою проблему.

public class Worker1
{
    [Import(typeof(IDataProvider))]
    public IDataProvider DataProvider;

    public Worker2 second;
    //use data provider to perform logic
}

public class Worker2
{
    [Import(typeof(IDataProvider))]
    public IDataProvider DataProvider;

    //use data provider to perform logic
}

[Export(typeof(IDataProvider))]
public class GeoDataProvider : IDataProvider
{
    //implements logic
}

public class Container
{
    private Worker1 t1;
    public void Init()
    {
        AggregateCatalog cat = new AggregateCatalog();
        cat.Catalogs.Add(new AssemblyCatalog(Assembly.GetExecutingAssembly()));
        cat.Catalogs.Add(new DirectoryCatalog("."));

        CompositionContainer c = new CompositionContainer(cat);
        c.ComposeParts(new GeoDataProvider(), this);
    }

    public void PerformLogic()
    {
        t1 = new Worker1;
        //here it fails because I need c.ComposeParts(t1):
        t1.DoSomethingWithProvider();
        //but even if I do c.ComposeParts(t1), still the t1.second.DataProvider will be null
        //how to avoid this?
    }
}

То, на что я надеюсь, это способ свободно создавать новые экземпляры Worker1 / Worker2 без необходимости знать, что они должны быть составлены перед использованием.Это возможно?

1 Ответ

4 голосов
/ 14 декабря 2010

Кто-то должен знать, что им нужно составить.

Если вы собираетесь свободно создавать экземпляры Worker1 и Work2 вместо того, чтобы разрешать MEF создавать их, то вы также должны дать MEF возможность удовлетворить импорт импортановые экземпляры или, как вы обнаружили, поле IDataProvider никогда не заполняется.

Вот пример, в котором вы просто позволяете MEF создавать классы по мере необходимости.Для настройки всего необходим только один вызов «ComposeParts».

[Export]
public class Worker1
{
  [Import]
  public IDataProvider DataProvider;

  [Import]
  public Worker2 second;

  //use data provider to perform logic
  public void DoSomethingWithProvider() {
    }
}

[Export]
public class Worker2
{
  [Import]
  public IDataProvider DataProvider;

  //use data provider to perform logic
}

[Export( typeof( IDataProvider ) )]
public class GeoDataProvider : IDataProvider
{
  //implements logic
}

public class Container
{
  [Import]
  private Worker1 t1;

  public void Init()
  {
    AggregateCatalog cat = new AggregateCatalog();
    cat.Catalogs.Add( new AssemblyCatalog( Assembly.GetExecutingAssembly() ) );
    cat.Catalogs.Add( new DirectoryCatalog( "." ) );

    CompositionContainer c = new CompositionContainer( cat );
    c.ComposeParts( this );
  }

  public void PerformLogic()
  {
    t1.DoSomethingWithProvider();
  }
}
...