如何在温莎城堡中“开始范围”特定的自定义范围生活方式?

use*_*740 5 scope castle-windsor using-statement inversion-of-control castle-windsor-3

我创建了一个自定义范围访问器(它只是返回 DefaultLifetimeScope),以便能够添加自定义范围的生活方式。然后该组件被注册为

Component
   .For<..>
   .LifestyleScoped<CustomScope>()
Run Code Online (Sandbox Code Playgroud)

但是,我不知道如何实际启动新的 CustomScope 范围/生命周期。该文档显示使用开始一个新范围

using (Container.BeginScope()) {
   // ..
}
Run Code Online (Sandbox Code Playgroud)

但我的目标是创建/开始/启动特定范围,而不是通用LifestyleScoped()注册。新的作用域应该只影响显式注册到 CustomScope 的组件;不是通用范围组件或针对其他范围生活方式注册的组件。

开始(我的自定义范围)范围/生命周期的过程是什么?

请链接至相关文档;正如我所问,因为我无法轻易找到它。该代码使用Castle Windsor 3.3。


背景:

我来自 Autofac,正在寻找相当于每个匹配生命周期范围的实例来在 EF 上下文上建立 UoW。“每个请求”可能有多个 UoW,并且不同的存储库可能有不同的 UoW - 我还希望将来支持嵌套。

虽然有很多文章讨论创建 UoW 模式,但它们[全部]都与某些上下文(例如 HTTP 或 WFC 请求)绑定(错误地,IMOHO) - 而这不是这个问题的目的。我特别感兴趣的是如何启动一个自定义作用域,该作用域向下流过调用图并“存在于”using 块内。


笔记:

BoundTo()(和LifestyleBoundTo()/ )生活方式LifestyleBoundToNearest()与对象图相反(并且需要改变类型),并且切换到这样的生活方式严格来说并不是这个问题的解决方案/答案。但是,如果能为他们提供一个好的案例..

Can*_*kut 2

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 */
}
Run Code Online (Sandbox Code Playgroud)

此扩展方法不关心您的自定义ILifetimeScope实现。

Container.BeginScope()您无需调用,只需new CustomScope()最后处理它,以确保您的“自定义范围对象”正确释放。

您可以Container.BeginScope()在内部调用CustomScope并最终处置它们,以支持在默认生命周期范围内注册的组件。