簡體   English   中英

溫莎城堡的生活方式無法按范圍注冊

[英]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有依賴於ICustomreDalICustomreDal具有依賴性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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM