Импорт класса с определенным параметром - PullRequest
1 голос
/ 18 декабря 2011

Я получил ViewModel, которую я экспортирую с MEF.Мне бы хотелось, чтобы эта ViewModel инициализировалась по-разному при каждом импорте, в соответствии с параметром enum / конкретного объекта, который будет ему предоставлен.

Я немного читал на эту тему и обнаружил, что, может быть, это -

http://msdn.microsoft.com/en-us/library/ee155691.aspx#metadata_and_metadata_views

сможет соответствовать моим потребностям, но яне уверен, что это будет лучшим способом сделать это.

Еще один метод, о котором я думал, это нормально импортировать класс, а затем, когда у меня есть экземпляр, вызвать специальный метод инициализации, который быполучить мой параметр.Однако это не похоже на классическую реализацию MEF, и, возможно, теряет часть ее «волшебства».

Я надеюсь, что кто-то сможет указать мне, какой метод рекомендован для достижения этой цели.,

Спасибо!

1 Ответ

1 голос
/ 19 декабря 2011

Обходной путь - экспорт фабрики, которая создает экземпляры вашего типа. Хотя это означает, что вы не можете напрямую импортировать эти экземпляры, тем не менее преимущество заключается в том, что логика их создания - это ответственность фабрики, поэтому пользователям класса не нужно знать об этом:

public class ServiceWithParameter
{
  public ServiceWithParameter( int a )
  {
    this.a = a;
  }

  private readonly int a;
}

[Export]
public class ServiceWithParameterFactory
{
  public ServiceWithParameterFactory()
  {
    instance = 0;
  }

  public ServiceWithParameter Instance()
  {
    return new ServiceWithParameter( instance++ );
  }

  private int instance;
}

  //now everywhere you need ServiceWithParameter:
[Import]
ServiceWithParameterFactory serviceFactory;

var instanceA = serviceFactory.Instance(); //instanceA.a = 0
var instanceB = serviceFactory.Instance(); //instanceB.a = 1

Более расширяемый способ - сообщить контейнеру, что у вас есть фабрика, и пример представлен здесь: http://pwlodek.blogspot.com/2010/10/mef-object-factories-using-export.html

...