2011-12-12 76 views
0

在我的控制,我想建立以下服務:我可以在控制器的Initialize方法中訪問模型信息嗎?

private IAccountService _accountService; 
    private IDataSourceService _dataSourceService; 
    private IProductService _productService; 
    private ISequenceService _sequenceService; 

    protected override void Initialize(RequestContext requestContext) 
    { 
     base.Initialize(requestContext); 
    } 

但是設置這些行動需要,我知道在來自看法和指定的DataSourceID模型中的屬性的值。

在控制器的初始化方法是模型信息可用?如果答案是否可用,我可以檢查會話變量嗎?

回答

0

我不知道你爲什麼會想這樣做。控制器不應該負責配置它的依賴關係。你應該使用控制反轉(又名依賴注入)容器來注入構造函數中的所有依賴。

如果你的服務需要在施工,我強烈建議模型的具體信息您檢查您的架構,因爲這不應該是這樣的。最有可能的是最好在方法調用(方法注入)中傳遞該信息,或者將依賴關係抽象爲服務。

情況下你需要存儲在會話信息,你也可以考慮在一個服務包的會話。然後,您可以將會話服務注入爲依賴項。這也可以使單元測試你的控制器變得更容易。

+0

我的情況可能不尋常。我有管理屏幕,每個屏幕允許用戶從許多不同的數據源位置中選擇一個數據源。我想在初始化器中設置我的服務實例,但是設置它們需要我知道用戶選擇了哪些數據源。如果我不在初始化程序中這樣做,那麼我將不得不創建以數據源作爲參數的服務的實例。 –

+0

我不認爲這很不尋常;儘管它可能需要額外的抽象,因爲並非所有數據訪問服務的實例都使用相同的數據源。您可以提供一個服務來處理從通用名稱中選擇數據源。如果您將該服務注入數據訪問服務,它將允許您將數據源名稱與來自您的操作方法的每個調用一起傳遞。如果您無法修改數據服務實現,則可以創建一個使用像委託或工廠這樣的延遲相關性創建策略的包裝器。 –

0

不要砍MVC框架的內部運作。在我看來,你想要做什麼實際上是控制反轉,或依賴注入。在MVC中得到很好的支持,你只需要讓控制器的構造函數接受這些服務(作爲接口)並設置IoC容器(MVC3內置與所有主要IoC容器兼容的DependencyResolver--我個人喜歡Ninject)。這裏有很多教程,例如Ninject可以通過nuget完全自動設置。

+0

望着MSN文檔我看到以下內容:「這種方法不能直接調用,以提供額外的處理任務重寫此方法被調用的所有的ActionResult方法之前,如設置線程的區域性或指定自定義提供商。 TempData對象「。是不是在某種程度上說我可以重寫此方法來設置控制器方法? –

+0

不,它不是..它是說當你需要一些非標準的東西(自己的TempData提供者 - 我從來沒有見過這種需要)時,重寫初始化方法是最後的手段。向控制器注入服務不是這種情況,應該定期完成 - 通過使用IoC容器進行構造器注入。 – rouen

相關問題