2011-07-03 73 views
1

我想依賴注入使用Spring.Net在ASP.NET MVC的屬性,我的屬性是這樣的(注意,這是所有的僞代碼,我剛纔輸入)...Spring.Net和屬性注入

public class InjectedAttribute : ActionFilterAttribute 
{ 
    private IBusinessLogic businessLogic; 

    public InjectedAttribute(IBusinessLogic businessLogic) 
    { 
     this.businessLogic = businessLogic; 
    } 

    public override void OnActionExecuting(ActionExecutedContext filterContext) 
    { 
     // do something with the business logic 
     businessLogic.DoSomethingImportant(); 
    } 
} 

我正在使用控制器工廠來創建也注入了各種業務邏輯對象的控制器。我是從這樣的IoC容器獲取控制器...

ContextRegistry.GetContext().GetObject("MyMVCController"); 

我配置我的控制器,像這樣通過在業務邏輯

<object name="MyMVCController" type="MyMVC.MyMVCController, MyMVC"> 
    <constructor-arg index="0" ref="businessLogic" /> 
</object> 

是否有配置注射的方式的屬性?我真的不希望把這個變成我的屬性...

public class InjectedAttribute : ActionFilterAttribute 
{ 
    private IBusinessLogic businessLogic; 

    public InjectedAttribute(IBusinessLogic businessLogic) 
    { 
     this.businessLogic = ContextRegistry.GetContext().GetObject("businessLogic"); 
    } 
    .... 

回答

2

我配置我的控制器,像這樣通過在業務邏輯

這定義控制器作爲單身意味着它們將在可能造成災難性的所有請求中重用。確保控制器沒有定義爲單例:

<object name="AnotherMovieFinder" type="MyMVC.MyMVCController, MyMVC" singleton="false"> 
    <constructor-arg index="0" ref="businessLogic" /> 
</object> 

現在,這是說,讓我們回到關於屬性的主要問題。

因爲你想在你的過濾器構造函數注入可以不再裝點任何控制器或動作與他們的屬性值必須在編譯時是已知的。您需要一種機制在運行時將這些過濾器應用於控制器/操作。

如果您正在使用ASP.NET MVC 3,你可以寫一個custom filter provider將通過注入依賴進去你的行動應用過濾器所需的控制器/行動。

如果您使用的是舊版本,你可以使用一個custom ControllerActionInvoker

+0

它的MVC 1,所以我將無法使用自定義篩選器提供程序... – Gaz

+0

這工作很好,最佳答案:) – Gaz