1

我在ASP.NET應用程序中使用Spring.NET 1.3.2,NHibernate 3.1和OSIV模式。Spring.NET + NHibernate +請求作用域對象不能很好地協作

我有一個自定義EventListener需要進行要求範圍的,因爲它使用 HttpContext.Current.Items作爲構造依賴。

由於ISession也是請求作用域,我應該能夠使用Spring.NET來管理這些依賴關係。

的問題是,EventListener,像IInterceptor,是作爲請求範圍(這是一個單)的ISessionFactory一個屬性。 Web對象作用域之間的不匹配是有問題的。

我試過下面的XML代碼片段,但是條件表達式總是返回null。我認爲這是由於Spring在應用程序級別範圍內創建了EventListener對象,並且在HttpContext.Current.Items有機會被填充之前。

<object id="EventListener" scope="request" type="MyEventListener,DAL"> 

     <constructor-arg index="0" expression="T(System.Web.HttpContext).Current.Items.Contains('Principal')?T(System.Web.HttpContext).Current.Items['Principal']:null"/> 

    </object> 

所以我的要求是:

  1. 配置自定義EventListener對象春,使其產生在每個請求的基礎必須發生

  2. EventListener實例下旬足夠請求生命週期,以便HttpContext.Current.Items ['Princpial']已由自定義IHttpModule填充

  3. EventListener實例被注入到當前OSIV ISession

回答

1

我想你想這樣做周圍的錯誤的方式。根據NHibernate documentationEventListener應基本上被認爲是你的應用程序的單身人士。

即使你與SessionFactory註冊您的自定義EventListener,說在請求開始,你還有沒有保證,這個監聽器將只收到在當前HttpContext引發的事件。

相反,您應該在配置會話工廠時在全局註冊您的事件處理程序。如果需要上下文信息(如主體),則可以使用(http)上下文感知實現注入依賴關係,或者將其實施爲ambient context

從自定義偵聽器中,您可以訪問引發該事件的會話。就拿這個ILoadEventListener實現:

public class CustomLoadEventListener : ILoadEventListener 
{ 
    private IPrincipalProvider _principalProvider; 

    public CustomLoadEventListener(IPrincipalProvider provider) 
    { 
     _principalProvider = provider; 
    } 

    public void OnLoad(LoadEvent @event, LoadType loadType) 
    { 
     var sessionThatRaisedTheEvent = @event.Session; 
     var principalForTheCurrentContext = _principalProvider.GetCurrentPrincipal(); 
    } 
} 

public interface IPrincipalProvider 
{ 
    IPrincipal GetCurrentPrincipal(); 
} 

public class HttpContextPrincipalProvider : IPrincipalProvider 
{ 
    public IPrincipal GetCurrentPrincipal() 
    { 
     return System.Web.HttpContext.Current.User; 
    } 
} 

這可能不是你所希望得到的答案,但你問IMO什麼會戰鬥的基礎設施,我一般儘量避免。

如果您發佈更多關於您想要實現的細節,我們可能會提出更好的解決方案。你應該怎麼做EventListener

相關問題