В вашем примере вы запускаете безымянную область из контейнера, а не из родительского элемента с именем:
using (var unnamedScope = container.BeginLifetimeScope())
Переключите это, чтобы быть потомком области с именем, и это будет работать.
using (var unnamedScope = innerScope.BeginLifetimeScope())
Я бы также отметил, что вы назвали эти outerScope
и innerScope
, но innerScope
на самом деле не является потомком outerScope
, поэтому имена вводят в заблуждение. Технически эти две области равноправны.
- контейнер
- innerScope (named)
- externalScope (named)
- unnamedScope
Все три являются прямыми потомками контейнера. Если вы подумываете о совместном использовании пользователя с точки зрения иерархии области действия, вам нужно будет создавать дочерние области от родителей, у которых есть дети.
- контейнер
- innerScope (named)
- unnamedScope
- externalScope (named)
- unnamedScope
Вы заметите, что внутреннее и внешнее - все еще одноранговые узлы - у вас не может быть родительского и дочернего элементов с одинаковыми именами, поэтому, учитывая, что оба внутренних и внешних имени имеют имена, они никогда не будут совместно использовать одну и ту же иерархию, кроме контейнера .
Я бы настоятельно рекомендовал не пытаться обойти здесь иерархическую модель. Например, скажем, вы действительно пытаетесь сделать это:
- контейнер
- externalScope (named)
- unnamedScope
Что может выглядеть так:
using(var outerScope = container.BeginLifetimeScope(USER_IDENTITY_SCOPE))
using(var unnamedScope = container.BeginLifetimeScope())
{
//...
}
Это в значительной степени то, что у вас есть во фрагменте выше. Единственный общий доступ к этим областям - на уровне контейнера. Если вы попытались разрешить что-то из указанной области и передать ее в одноранговую область, вы рискуете избавиться от вещей из-под себя или других странных проблем, которые трудно устранить. Например, если outerScope
утилизируется, но unnamedScope
живет, вы можете попасть в беду.
// PLEASE DO NOT DO THIS. YOU WILL RUN INTO TROUBLE.
using(var outerScope = container.BeginLifetimeScope(USER_IDENTITY_SCOPE))
{
var user = outerScope.Resolve<User>();
using(var unnamedScope = container.BeginLifetimeScope(b => b.RegisterInstance(user)))
{
//...
}
}
Это плохие новости, которые ожидают, начиная со странных проблем утилизации и заканчивая вещами, не разделяющими тот же набор зависимостей, когда вы думаете, что они должны это делать. Но, вы знаете, мы можем дать вам пистолет, это ваше дело, чтобы не выстрелить себе в ногу с ним.