Контекст: Owin (самообеспечение хост) + WebAPI + UseAutofacMiddleware + UseAutofacWebApiУправление Lifetime Прицелы с Autofac
То, что я пытаюсь сделать, это:
Зарегистрировать ILog
экземпляр в контейнере запуска приложения.
Для каждого запроса зарегистрируйте новый экземпляр ILog
, обертывающий «корневой» экземпляр, чтобы каждое его промежуточное программное обеспечение и/или службы запроса могли его использовать.
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterInstance(log).As<ILog>();
containerBuilder.Register(ctx => {
var rootLog = ctx.Resolve<ILog>();
return new PrependStringLog(rootLog, "request: ");
}).InstancePerRequest();
Однако Autofac жалуется на циклическую зависимость, когда Instancing промежуточного слоя, имеющий в своих конструкторах в ILog
.
Если я называю «корневой журнал» и разрешаю с заданным именем, все работает так, как ожидалось.
containerBuilder.RegisterInstance(log)
.Named("root", typeof(ILog));
containerBuilder.Register(ctx => {
var rootLog = ctx.ResolveNamed<ILog>("root");
return new PrependStringLog(rootLog, "request: ");
}).InstancePerRequest();
Я вынужден использовать именованный экземпляр, чтобы заставить его работать?
На моем взгляде, имея разные прижизненные прицелы были достаточно, чтобы ослабить механизм разрешения. В конце концов, область запроса по запросу имеет родительскую область, в которой уже имеется вполне допустимый экземпляр ILog, и это будет циклическая зависимость. При этом я понимаю ваши рассуждения, я буду продолжать использовать именованные экземпляры. – Raine