如何" BeginScope"在温莎城堡享受特定的定制生活方式?

时间:2014-12-30 16:36:22

标签: scope inversion-of-control castle-windsor using-statement castle-windsor-3

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

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

然而,我不知道如何开始一个新的CustomScope范围/生命周期。 The documentation shows使用

开始新范围
using (Container.BeginScope()) {
   // ..
}

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

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

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


背景:

我来自Autofac,我正在寻找相当于Instance Per Matching Lifetime Scope来建立一个关于EF上下文的UoW。每个请求可能有多个UoW&#34;&#34;并且可能有不同的UoW用于不同的存储库 - 我也希望将来支持嵌套。

虽然有很多文章都在谈论创建UoW模式,但是它们(所有)被绑定(错误地,IMOHO)到某些上下文,例如HTTP或WFC请求 - 这不是这个问题的内容。我特别感兴趣的是如何启动一个自定义范围,该范围在调用图中向下流动,并且&#34;生活在内部&#34;使用块。


注意:

BoundTo()(以及LifestyleBoundTo() / LifestyleBoundToNearest())生活方式与对象图一起工作(并且需要更改类型)并且切换到此类并不是严格意义上的解决方案/答案题。但是,如果可以为他们提供良好的案例..

1 个答案:

答案 0 :(得分: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(),而是将其置于最后,以确保您的&#34;自定义范围对象&#34;正确释放。

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