[英]Castle Windsor scoped life style fails to register per scope
我正在使用一個允許在某些入口點進行攔截的框架。
框架范圍不是Web請求,不是線程,不是瞬時的,類似於基於線程的東西,但是我看到了很多地方可以重用線程。
所以我需要一個自定義范圍,在這里我說范圍的起點和終點。
由於我有很多依賴關系,因此大多數依賴關系是在靜態承包商中定義的,因為它們是無狀態的。
我有一個依賴項,實際上需要在每個框架攔截中注入。
這是攔截方法,以及我如何進行注入(框架沒有調用此方法)。 因此,我這里需要注入AppContext
並確保Castle始終為我解析正確的上下文(在范圍內)
public void Execute(AppContext context)
{
using (var s = CastleContainer.Container.BeginScope())
{
CastleContainer.Container.Register(Component.For<AppContext>().LifestyleScoped().Instance(context));
var logic = CastleContainer.Container.Resolve<ICustomerLogic>();
// begin invocation
}
}
ICustomerLogic
有依賴於ICustomreDal
和ICustomreDal
具有依賴性AppContext
。
因此,當我解析Resolve<ICustomerLogic>()
我想確保ICustomreDal
具有當前的AppContext
。
ICustomerLogic
已注冊為單例,而ICustomreDal已注冊為瞬態。
第一個執行正常,第二個執行我收到錯誤:
無法注冊AppContext。 已經有一個具有該名稱的組件。 您是否要修改現有組件? 如果不是,請確保指定唯一名稱。
城堡不應該進行范圍分割,所以每個范圍都有自己的依賴性嗎?
我究竟做錯了什么?
請注意,我們正在談論每秒執行50次。
BeginScope與注冊無關,僅與組件解析有關。 將確保在using語句結束時,釋放(在必要時進行處置)在using語句中創建的,帶有生活方式Scoped的任何組件。 它不會取消注冊塊中已注冊的組件。 通常,在多個位置注冊組件是一個壞主意。 僅在應用程序啟動時注冊組件。
我一直在努力地應對類似問題,最后使用這種解決方法時,我並不完全滿意,但是如果有任何人有更好的解決方案,我很想聽聽。 根據您的情況,它看起來像這樣:
在您的注冊碼中使用:
Component.For<ICustomerLogic>().ImplementedBy<CustomerLogic>().LifestyleScoped
Component.For<AppContext >().UsingFactoryMethod(() => (AppContext)Thread.GetNamedDataSlot("context")).LifestyleTransient() // or scoped
使您的執行功能適應:
public void Execute(AppContext context)
{
using (var s = CastleContainer.Container.BeginScope())
{
Thread.SetData(Thread.GetNamedDataSlot("context"), context);
var logic = CastleContainer.Container.Resolve<ICustomerLogic>();
Thread.SetData(Thread.GetNamedDataSlot("context"), null);
// begin invocation
}
}
祝好運,
Marwijn。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.