Вам необходимо учитывать срок службы вашего сервиса.Синглтон сервис, вероятно, подойдет, так как 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
.