3

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

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

Однако, я в недоумении, как на самом деле начать новый CustomScope сфера/срок службы. The documentation shows начинает новую область с помощью

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

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

Каков процесс создания (Моей пользовательской области) области действия/жизни?

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


фон:

гряда из Autofac и я ищу эквивалент в Instance Per Matching Lifetime Scope, чтобы установить UOW над контекстом EF. Может быть несколько UoWs «за запрос», и могут быть разные UoW для разных репозиториев - мне также будет нужна поддержка для гнездования в будущем.

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


Примечание:

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

 Смежные вопросы

  • Нет связанных вопросов^_^