Добавление пользовательского контейнера в MEF - PullRequest
1 голос
/ 31 августа 2011

У меня есть следующий случай с использованием MEF.

Я строю свое решение многими модулями, каждый модуль существует в своей отдельной dll. Я использую MEF как выбор для создания всего моего проекта. Он отлично работает, но иногда я добавляю для модуля класс службы, скажем (AppService), этот класс просто имеет пользовательские статические методы, которые имеют дело с универсальным сервисом этого конкретного модуля. Теперь в этом методе мне нужен некоторый сервис, который уже составлен в MEF. Контейнер MEF уже существует в программе почтовой оболочки. Как можно получить ссылку на нужную мне ссылку. если я использую [Импорт], это не работает. Пример:

public class AppService
{
  [Import]
  public IService MyService {get;set;}

  public static int Calc()
  {
      return MyService.Calc();   //My service is null
  }
} 

Заранее спасибо ...

1 Ответ

2 голосов
/ 31 августа 2011

Я думаю, что у вас действительно есть несколько проблем с этим кодом.

1. Вы подтвердили, что ваш тип AppService создается?Поскольку вы не [Export] -ing это, я не могу видеть, как это генерируется.Если вы не извлекаете экземпляр AppService из контейнера, вы должны вручную выполнить импорт:

var service = new AppService();
container.ComposeParts(service);

2.В вашем дизайне класса есть метод static, к которому вы пытаетесь обратитьсяinstance свойство.Я предполагаю, что вы пытаетесь это сделать по одной из двух причин.Либо вы предполагаете, что interface для IService поддерживает статические операции (чего они не могут), либо вы вызываете метод расширения, поддерживающий тип IService, который не выполняется из-за первого аргумента подозреваемого метода расширенияимеет значение null:

public static int Calc(this IService service) 
{
    return service.Calc(); // failing perhaps?
}

Если это последний сценарий метода расширения, он предлагает что-то похожее на 1), где вам нужно подтвердить, что ваш тип AppService создается после его создания.

Тот факт, что у вас есть метод static, пытающийся получить доступ к свойству instance, говорит мне, что вам, возможно, все равно придется переосмыслить свой дизайн и удалить модификатор static:

public int Calc()
{
    return MyService.Calc();
}

Но опять же, ваша собственность является публичной, поэтому этот метод вообще используется? Ваш текущий пример не должен даже компилироваться, так как вы пытаетесь получить доступ к свойству экземпляра из статического метода.

...