Как выбрать "BeginScope" для определенного стиля жизни в замке Виндзор?

Я создал пользовательский Scope Accessor (он просто возвращает DefaultLifetimeScope), чтобы иметь возможность добавить пользовательский образ жизни с ограничениями. Затем компонент регистрируется как

Component
   .For<..>
   .LifestyleScoped<CustomScope>()

Тем не менее, я не знаю, как на самом деле начать новую область действия / срок действия CustomScope. Документация показывает начало новой области с помощью

using (Container.BeginScope()) {
   // ..
}

но моя цель состоит в том, чтобы создать / начать / запустить конкретную область, а не для общего LifestyleScoped() постановка на учет. Новая область действия должна затрагивать только компоненты, явно зарегистрированные в CustomScope; не общие компоненты или компоненты с областью действия, зарегистрированные в отношении других образов жизни с областью применения.

Каков процесс, чтобы начать (My Custom Scope) область / срок действия?

Пожалуйста, ссылку на соответствующую документацию; как я спрашиваю, потому что я не смог найти его с готовностью. Код использует Замок Виндзор 3.3.


Фон:

Я приехал из Autofac и ищу эквивалент Экземпляра на каждый жизненный диапазон, чтобы установить UoW в контексте EF. Может быть несколько UoW "на запрос", и могут быть разные UoW для разных репозиториев - я также хотел бы, чтобы поддержка вложения была в будущем.

Хотя существует множество статей, в которых говорится о создании шаблона UoW, они [все] связаны (неверно, IMOHO) с некоторым контекстом, таким как HTTP или WFC-запрос - и это не тот вопрос, о котором идет речь. Меня особенно интересует, как запустить собственную область видимости, которая течет вниз через граф вызовов и "живет внутри" блока using.


Заметки:

BoundTo() (а также LifestyleBoundTo()/LifestyleBoundToNearest()) образ жизни работает против объектного графа (и требует изменения типов), и переключение на него не является строго решением / ответом на этот вопрос. Однако, если хороший аргумент может быть сделан для них..

1 ответ

Container.BeginScope() инициализирует новый CallContextLifeTimeScope,

https://github.com/castleproject/Windsor/blob/aa9b8b353ee2e533d586495eec254e216f800c09/src/Castle.Windsor/MicroKernel/Lifestyle/LifestyleExtensions.cs

using Scope = Castle.MicroKernel.Lifestyle.Scoped.CallContextLifetimeScope;

public static class LifestyleExtensions
{
    public static IDisposable BeginScope(this IKernel kernel)
    {
        return new Scope(kernel);
    }
    /* rest of the code removed for simplicity */
}

Этот метод расширения не заботится о ваших пользовательских ILifetimeScope реализация.

Вместо звонка Container.BeginScope()можно просто new CustomScope() и утилизируйте его в конце, чтобы убедиться, что ваши "объекты с пользовательской областью" высвобождены правильно.

Ты можешь позвонить Container.BeginScope() внутри вашего CustomScope и удалите их оба в конце для поддержки компонентов, зарегистрированных с областью действия по умолчанию.

Другие вопросы по тегам