我创建了一个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()
)生活方式与对象图一起工作(并且需要更改类型)并且切换到此类并不是严格意义上的解决方案/答案题。但是,如果可以为他们提供良好的案例..
答案 0 :(得分:1)
Container.BeginScope()
初始化新的CallContextLifeTimeScope
。
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
并将它们放在最后,以支持使用默认生命周期范围注册的组件。