С вики-страница Autofac для областей действия экземпляра ...
При использовании одной области видимости один экземпляр возвращается из всех запросов в родительском и всех вложенных контейнерах.
Что означает, что у вас есть такие вложенные области видимости ...
container
scope-1
scope-2
Тогда, если вы зарегистрируете синглтон в "scope-1", тогда, когда вы разрешите его в "scope-2", вы получите тот же синглтон. С другой стороны, если вы попытаетесь разрешить это в контейнере, вы ничего не получите, потому что он там не был зарегистрирован - регистрации «наследуют» дерево, а не вверх, как показывают ваши тесты .
В блоге Ника Блумхардта есть хороший праймер для областей действия Autofac и разрешения компонентов. Вы можете заметить одну запутанную вещь: упоминание о том, как компоненты с одной областью действия разрешаются, если регистрация не входит в текущую область.
Допустим, вы зарегистрировали синглтон в "scope-1", и этот синглтон имеет зависимость. Далее, скажем, зависимость зарегистрирована как в «scope-1», так и в «scope-2». Теперь вы разрешаете синглтон из "scope-2". Так как синглтон зарегистрирован в "scope-1", он разрешит свои зависимости от "scope-1" вместо использования переопределения в "scope-2" - потому что, как только "scope-2" заканчивается, синглтон все равно должен остаться в «сферу действия-1» для других потреблять.
В других областях вашего сценария, , вы также можете столкнуться с "последним в выигрыше" . Если вы зарегистрируете синглтон в «контейнере», а затем другой в «scope-1», при разрешении из «scope-2» вы получите тот, который зарегистрирован в «scope-1», а не тот, который находится в корневом каталоге. Тем не менее, вы также должны быть в состоянии решить все из них, как ...
scope.Resolve<IEnumerable<IMySingleton>>();
Если вы разрешите IEnumerable вашего компонента, вы получите все зарегистрированные компоненты, а не только последний, который вы зарегистрировали.
Полагаю, это длинный способ сказать это не ошибка, вот как работает Autofac .
Если вы используете мультитенантность с Autofac, смотрели ли вы на AutofacContrib.Multitenant ? Это одна из предоставленных библиотек, которая имеет встроенную поддержку таких вещей, как синглтоны на основе арендаторов. Для этого тоже есть вики-страница на Autofac. Вы можете настроить значения по умолчанию на уровне приложения и затем переопределения для конкретного арендатора. Вы также можете делать такие вещи, как ...
containerBuilder.RegisterType<MyType>().As<IMyType>().InstancePerTenant();
... что делает регистрацию синглетов-арендаторов на корне довольно простой.
Пока нет пакета NuGet для библиотек contrib в Autofac (мы работаем над этим), поэтому вам придется перейти на сайт и загрузить вручную, но это может помочь решить вашу проблему.
[Полное раскрытие: я написал AutofacContrib.Multitenant.]