У нас есть консольное приложение, в котором размещены все наши службы WCF с использованием класса ServiceHost
.
Чтобы иметь возможность использовать MEF, у нас есть реализация IInstanceProvider
, которая загружает контейнер композиции MEF.Этот поставщик экземпляра назначается для Сервиса с использованием IContractBehaviorAttribute
.
public class MefBehaviorAttribute : Attribute, IContractBehavior, IContractBehaviorAttribute
{
void IContractBehavior.ApplyDispatchBehavior(ContractDescription contractDescription, ServiceEndpoint endpoint, DispatchRuntime dispatchRuntime)
{
dispatchRuntime.InstanceProvider = new MefInstanceProvider(contractDescription.ContractType);
}
...
}
. Пока все работает нормально.
Для конкретной реализации сервиса я хотел применить атрибут ServiceBehavior
.установив для InstanceContextMode
значение «Одиночный», чтобы сделать службу одноэлементной.
[Export(typeof(IService))]
[MefBehavior]
[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class Service : ServiceBase, IService, IDisposable
{
[Import]
private IImportedClass instance;
...
Проблема заключается в том, что экземпляр службы создается сразу после создания экземпляра ServiceHost
.К тому времени поведение контракта еще не было назначено и, следовательно, еще не выполнено, что привело к ошибке компоновки, поскольку контейнер компоновки еще не был загружен.
Как правильно создать экземпляр одноэлементной службы, который можетиспользовать MEF?