3

我创建了一个custom Scope Accessor(它只是返回DefaultLifetimeScope),以便能够添加自定义作用域生活方式。该组件然后注册为如何在Windsor Castle的特定Custom Scoped生活方式中使用“BeginScope”?

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,并且对于不同的存储库可能有不同的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()和最终处置它,以确保您的“自定义作用域对象”正确释放。

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