Задать неинжектированные параметры при импорте объектов с использованием MEF - PullRequest
1 голос
/ 08 ноября 2011

В моем приложении Silverlight 4 есть следующий сценарий:

public class TheViewModel
{
    [Import()]
    public TheChild Child { get; set; }
}

[Export()]
public class TheChild
{
    [ImportingConstructor()]
    public TheChild(String myName, IAmTheService service) { ... }
}

[Export(typeof(IAmTheService))]
public class TheService : IAmTheService
{
    public void DoSomething(String theName);
}

Как видите, для конструктора TheChild требуется один импортированный параметр и одно статическое значение, которое является контекстно-зависимым (должно быть предоставленородитель).Строковое значение не может быть получено из AppSettings, конфигурации и т. Д. И может быть предоставлено только текущим экземпляром родительского класса (в данном случае TheViewModel).

Как правило, я всегдаПодход к внедрению зависимостей выполняется следующим образом:

  1. Требуемые зависимости удовлетворяются путем внедрения в конструктор
  2. Необязательные зависимости выполняются путем внедрения свойства

Параметр "myName"требуется, поэтому я бы предпочел установить его через конструктор, но, учитывая работу MEF, я понимаю, что это, возможно, придется изменить.

Можете ли вы рассказать мне, как вы справились с этим сценарием, и ваши мысли, лежащие в основе решения

1 Ответ

1 голос
/ 08 ноября 2011

Вы можете указать конкретный импортный контракт вместе с [ImportingConstructor]. Например:

[Export()]
public class TheChild
{
    [ImportingConstructor()]
    public TheChild([Import("MyName")] String myName, IAmTheService service) { ... }

Учитывая это, экспорт строки, отмеченной [Export("MyName")], будет необходим и использован для выполнения зависимости. Любая из спецификаций [Import] должна работать в этом случае (т. Е. Импортировать подкласс по типу, импортировать по имени и т. Д.).

...