Где инициализировать каталог каталогов MEF в приложении WCF? - PullRequest
1 голос
/ 20 сентября 2011

Итак, в приложении WCF есть волшебный Application_Start или что-то подобное, где я могу составить контейнер MEF из каталога сборки?

Спасибо!

Ответы [ 3 ]

1 голос
/ 20 сентября 2011

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

0 голосов
/ 19 октября 2012

Я решил эту проблему, создав собственный InstanceProvider (реализующий IInstanceProvider). Я создаю расширение поведения конечной точки, которое позволило мне настроить сборки, которые я хочу для композиции. Я использовал каталоги сборок, но основной принцип тот же.

В конце концов, конфигурация XML выглядит так:

 <endpointBehaviors>
    <behavior name="jsonBehavior">
      <enableWebScript/>
  <endpointComposed>
    <assemblies>
        <add name="sampleApplication" value="SampleApplication"/>
    </assemblies>
      </endpointComposed>
    </behavior>                
  </endpointBehaviors>

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

У меня есть полная статья на эту тему: https://yoavniran.wordpress.com/2012/10/18/unit-testing-wcf-and-mef-part-2/ и пример кода на: https://bitbucket.org/yoavniran/wcf-mef-and-testing-sample-code/src

0 голосов
/ 20 сентября 2011

Вам необходимо учитывать срок службы вашего сервиса.Синглтон сервис, вероятно, подойдет, так как DirectoryCatalog нужно будет создать только один раз.С не одноэлементной службой DirectoryCatalog будет создаваться каждый раз при создании экземпляра службы, что может быть немного медленным (так как DirectoryCatalog сканирует папку, чтобы попытаться загрузить сборки).CompositionContainer экземпляры довольно дешевы, чтобы раскрутиться.Я стараюсь предоставить интерфейсную абстракцию:

public interface ICompositionContainerFactory
{
  CompositionContainer CreateCompositionContainer();
}

, которую я бы подключил:

public static class CompositionContainerBuilder
{
  private static readonly CompositionContainer _container;

  static CompositionContainerBuilder()
  {
    var factory = CreateCompositionContainerFactory();
    _container = factory.CreateCompositionContainer();
  }

  public static CompositionContainer Container { get { return _container; } }

  private static ICompositionContainerFactory CreateCompositionContainerFactory()
  {
    Type factoryType = // Get from somewhere - configuration perhaps?
    return (ICompositionContainerFactory)Activator.CreateInstance(factoryType);
  }
}

Если вы счастливы, что вам нужно создать контейнер только один раз,Вы можете уйти с этим методом.Вы создадите экземпляр ICompositionContainerFactory, который затем настроите.Контейнер создается один раз (и только один раз) через статический конструктор.Затем вы можете использовать CompositionContainerBuilder.Container, чтобы захватить контейнер.Затем просто подключите ваш контейнер MEF через IInstanceProvider и подключите его к услуге как IServiceBehavior.

...