Да, это определенно возможно - текущий контекст сообщения имеет заголовки, и он готов и доступен в момент разрешения обработчиков.
Это просто вопрос регистрации фабричного метода с Autofac, а затем вы можете получить доступ к контексту сообщения через статическое свойство MessageContext.Current
.
Я не знаю, как это выглядит с Autofac, но с Виндзор я хотел бы сделать что-то вроде этого:
container.Register(
Component.For<ISomeService>()
.UsingFactoryMethod(k => {
var context = MessageContext.Current;
if (context == null) {
var msg = "Must be inside Rebus handler to do this";
throw new InvalidOperationException(msg);
}
var headers = context.Headers;
// decide which implementation of ISomeService
// to return here.....
return new ConcreteService();
}, managedExternally: true)
.LifestyleTransient()
);
Я надеюсь, что вы можете перевести фрагмент Виндзорский к чему-то эквивалент в Autofac.
MessageContext.Current доступен в контексте DI? –
Да, это: это просто статический шлюз к экземпляру 'MessageContext', который привязан к потоку с использованием' LogicalCallContext', поэтому он корректно перетекает в продолжения. – mookid8000
Спасибо за ввод –