2011-08-02 237 views
1

我試圖注入屬性到我的SpringMvcApplication(從Spring.Web.Mvc)。ASP.NET MVC Global.asax注入彈簧

public class MvcApplication : SpringMvcApplication 
{ 
    public ISomeService SomeService { get; set; } 

    protected void Application_AuthenticateRequest(object sender, EventArgs e) 
    { 
     // Use SomeService 
    } 
} 

然後,我有一個包含我的定義

<?xml version="1.0" encoding="utf-8" ?> 
<objects xmlns="http://www.springframework.net"> 
    <object name="HttpApplicationConfigurer" type="Spring.Context.Support.HttpApplicationConfigurer, Spring.Web"> 
    <property name="ApplicationTemplate"> 
     <object> 
     <property name="SomeService" ref="ISomeService" /> 
     </object> 
    </property> 
    </object> 
    <object id="ISomeService" type="WebProject.Services.SomeService, WebProject"> 
    <constructor-arg ref="UserService" /> 
    </object> 
</objects> 

每當我嘗試使用SomeService屬性services.xml文件,我得到一個空引用異常。我的配置錯了嗎?我需要任何其他配置嗎?

我現在似乎不正確的解決方法是這樣的

protected override void ConfigureApplicationContext() 
{ 
    base.ConfigureApplicationContext(); 

    SomeService = (ISomeService)ContextRegistry.GetContext().GetObject("ISomeService"); 
} 

回答

3

MvcApplication擴展SpringMvcApplication類,這實際上樹立Spring.net背景,所以對我來說這看起來有點怪用di來配置它的屬性。

現在您正在覆蓋的方法旨在允許您在傳遞給asp.net mvc基礎結構之前對Spring.net應用程序上下文進行最後一次更改。

就你而言,稍微好一點的解決方法是讓SomeService直接在其getter中訪問上下文。這樣你就可以擁有Spring管理對象作用域的優點,你現在還沒有。

+0

我現在只重寫該方法,因爲我不確定如何獲取對我的服務的引用。因此,您不推薦Erich Eichinger在[本文](http://forum.springframework.net/showthread.php?t=5378)中的指導,您建議在我的getter中添加一些邏輯?當你說直接訪問上下文,你的意思是通過使用'Context.GetContext()'就像我在我的重寫方法?對不起,如果這是一個愚蠢的問題,我以前從未使用過Spring。 – Chris

+0

根本不是一個愚蠢的問題......我只是建議對現有的解決方法進行改進,但它仍應被視爲解決方法。注意你提到的帖子似乎涉及經典的asp.net支持,我不確定它是否適用於spring mvc。 – Marijn

+0

是的,我的意思是使用上面的Context.GetContext。但是這是你通常應該避免的事情,所以請考慮這是一個改進的解決方法,而不是一個確定的解決方案。 – Marijn