1

我有一個asp.net-mvc網站,我使用Unity進行依賴注入,並且我的所有依賴關係都進入了控制器或模型類,這些都發生在類的構造函數中。當在asp.net-mvc中使用依賴注入時,處理單個動作唯一依賴關係的最佳方式是什麼?

我現在的一個問題是,一個類實例化是昂貴的,它僅用於我的控制器內的單個動作,因此我不想將它傳遞到構造函數中以實例化所有其他被調用的動作在那個控制器上。我在網上看到的所有例子都有dependencies being injected into the controller like this

什麼是正確的方法來處理這種情況,我只需要一個依賴的單一行動。現在我只是在我的構造函數類中做「新」,這是我想避免的(因爲我沒有抽象和分離依賴實現),但至少我知道它不會成爲任何其他動作的性能命中。

回答

1

創建應用程序組件應該是fast and their constructors should be simple。任何沉重的初始化應該推遲。

當由於某些遺留代碼的存在而無法實現時,應該將該組件包裝在同一接口的代理實現後面。例如:

public class LazyServiceProxy : IService 
{ 
    private readonly Lazy<IService> service; 
    public LazyServiceProxy(Lazy<IService> service) { 
     this.service = service; 
    } 

    void IService.Method(object param1) => this.service.Value.Method(param1); 
} 

還要注意的是,你的依賴性僅在一個動作中使用的事實是你的控制器的操作方法之間的低凝聚力的指示。低內聚是Single Responsibility Principle(SRP)違規的跡象。 SRP規定每個班級都應該承擔一項責任,所以這可能意味着將行動及其依賴關係移交給自己的管理員是很好的做法。雖然通常的做法是根據共同的URL前綴將動作組合在一起(例如/customers/action),但MVC完全允許您將動作拆分爲多個控制器,同時保持其原始URL。

+0

謝謝Steven。我同意你的觀點。在「MVC完全允許你將動作分成幾個控制器的同時,保持它們的原始URL。」你在談論重定向嗎? – leora

相關問題