Вариант 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