Вариант 1. Использование Autofac.
Поставщик экземпляра Autofac, создающий экземпляр службы, не использует и не передает сообщение операции. Вот последняя реализация метода в Autofac. Обратите внимание, что параметр message не используется.
public class AutofacInstanceProvider : IInstanceProvider
{
// lots of code removed...
public object GetInstance(InstanceContext instanceContext, Message message)
{
if (instanceContext == null)
{
throw new ArgumentNullException("instanceContext");
}
var extension = new AutofacInstanceContext(_rootLifetimeScope);
instanceContext.Extensions.Add(extension);
return extension.Resolve(_serviceData);
}
}
Поэтому, чтобы получить желаемое поведение с существующим кодом Autofac, вам нужно внедрить зависимость в свой класс с помощью чего-то другого, кроме внедрения конструктора, то есть @решение Александра Никитина. Это разумно, но я согласен с комментарием «не люблю это».
Вариант 2. Пользовательский IInstanceProvider.
Написание пользовательского WCF IInstanceProvider — разумный вариант, но это потребует много кода.
Хорошая новость заключается в том, что код в Autoface.Integration.WCF — хороший пример, и вы можете подключить свою реализацию к Autofac.
Плохая новость заключается в том, что код Autofac.Integration.WCF сам по себе не использует внедрение зависимостей. Например, AutofacDependencyInjectionServiceBehavior напрямую вызывает var instanceProvider = new AutofacInstanceProvider(_rootLifetimeScope, _serviceData). В результате вам придется реализовать замену для AutofacInstanceProvider, AutofacDependencyInjectionServiceBehavior, AutofacHostFactory и, возможно, больше. Затем вам нужно будет создать расширение для AutofacInstanceContext, чтобы оно содержало информацию, прочитанную из сообщения. Это много кода.
Если вы собираетесь сделать пользовательский IInstanceProvider, я предлагаю прочитать блог Карлоса Фигейры:
- Расширяемость WCF — IInstanceProvider - для хорошего фона
- Расширяемость WCF — инспекторы сообщений — поиск раздела, который начинается с объектов WCF Message, может быть «использован только один раз». Вам необходимо следовать этим правилам при проверке сообщения.
21.01.2014
MyWcfServiceне будет знать, какая реализацияIServiceему нужна, пока не будет вызванаOperation. Ваша текущая подпись конструктора подразумевает, чтоMyWcfServiceзнает, какая единственная реализация ему нужна при создании экземпляра. Вы можете поумничать с большим количеством фреймворков, но на самом деле ваше намерение четко передается с помощью решения Александра. Например, если для первого вызоваOperationтребуетсяTypeA, а для второго вызова требуетсяTypeB,, то этот класс работает неправильно. 22.01.2014