Как выбрать "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
,
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
и удалите их оба в конце для поддержки компонентов, зарегистрированных с областью действия по умолчанию.