5

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

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

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

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

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

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

请链接到相关文档;正如我所问的,因为我无法轻易找到它。该代码使用的是温莎城堡 3.3。


背景:

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

虽然有许多文章谈论创建 UoW 模式,但它们 [都] 与 HTTP 或 WFC 请求等某些上下文相关联(错误地,IMOHO)——这不是这个问题的主题。我对如何启动自定义范围特别感兴趣,该范围通过调用图向下流动并“存在于” using 块中。


笔记:

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

4

1 回答 1

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 */
}

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

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

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

于 2017-05-27T05:55:00.307 回答