通常情況下,類的方法實例化,但沒有字段或屬性,有很多開銷?使用方法的類實例化有多快,但沒有字段或屬性?
我正在開發大量使用構造函數注入的ASP.NET MVC應用程序,並且一些控制器到目前爲止有多達10個依賴項。但由於大量的依賴關係,我使出了IMyAppServiceProvider
接口和類,提供給所有依賴通用接入,通過DependencyResolver在MVC 3
我撕掉了我所有的應用程序特定代碼,並創建了一個Gist與我的基本設置(這不包括下面提到的BaseController設置)。
我還創建了一個BaseController類,它接受IMyAppServiceProvider
。所有控制器都從這個基類繼承而來。基類採用IMyAppServiceProvider
對象,併爲所有各種服務保護了變量。代碼看起來像這樣:
public class BaseController
{
protected IService1 _service1;
protected IService2 _service2;
protected IService3 _service3;
// ...
public BaseController(IMyAppServiceProvider serviceProvider)
{
_service1 = serviceProvider.GetService<IService1>;
_service2 = serviceProvider.GetService<IService2>;
_service3 = serviceProvider.GetService<IService3>;
// ...
}
}
這使得控制器的代碼「乾乾淨淨」。沒有私有/受保護的變量,構造函數中沒有賦值,服務被基類保護變量引用。 但是,每個請求都會實例化我的應用程序使用的每一項服務,無論特定控制器是否使用它們全部。
我的服務很簡單,只是包含一些業務邏輯和數據庫交互的方法調用。他們是無國籍的,沒有階級領域或屬性。因此,實例化應該很快,但我想知道這是否是最佳實踐(我知道這是一個加載的術語)。
與往常一樣,輪廓第一。但是,我會猜測解決依賴性比實例化要慢數個數量級。 – 2012-03-13 20:22:12
@insta哇,我沒有通過樹木看到森林。但是Ninject和/或其他IoC容器緩存依賴性解決? – 2012-03-13 20:23:54
我在下面添加了一個答案,可以幫助你...我之前遇到過這個完全相同的問題。大多數人(包括我自己)不知道你可以重寫ASP.NET MVC用於創建控制器的控制器工廠。自定義的可以緊密集成您的IoC容器,並在需要時緩存依賴關係。 – 2012-03-13 20:33:02