我試圖解決一些啓動時間問題。在做一些分析後,我發現主要的罪魁禍首是ClassProxyGenerator.GenerateCode。第一次每種類型需要400-600毫秒。因此,如果應用程序的入口點有8個依賴項(在一個鏈中)需要代理生成,那麼應用程序的啓動時間將增加4.8秒。這可能看起來不是很多,但對於用戶來說,它看起來像年齡。DynamicProxy生成速度
任何建議,以改善這一點?
更新:
我可以重現的時間與以下控制檯應用程序:
var container = new WindsorContainer();
container.Register(Component.For<Interceptor>()); // dummy IInterceptor...does nothing
container.Register(Component.For<IMyRepository, MyAbstractRepository>().Interceptors<Interceptor>());
var t = DateTime.Now;
var instance = container.Resolve<IMyRepository>();
Debug.WriteLine("Resolved in " + (DateTime.Now - t).TotalMilliseconds);
輸出某處550ms和750毫秒之間。
IMyRepository是30個實體類型(由T4模板生成)的存儲庫接口。它有31個IQueryables,31個保存重載和31個刪除重載。 MyAbstractRepository是一個部分抽象類。它聲明瞭相同的3 x 31個方法。
如果我刪除所有保存和刪除的方法和只留下31個IQueryables,不註冊的抽象庫
container.Register(Component.For<IMyRepository>().Interceptors<Interceptor>());
我仍然奔波250ms的初始產生。
這是一個非常非常快的機器......所以現實世界中的任何事情都可能比上面列出的數字慢。
這是荒謬的 - 除非你的類型有成百上千的方法(或者你在20機器上運行代碼),否則不應該如此。你可以創建孤立的複製? –
我知道......並且它不是20年前的機器......它似乎是具有這種滯留(其他類型在5-10ms內產生)的特定類型的集合...我將隔離並提供代碼示例。 – Jeff
如果您的依賴項可以延遲使用,您可能可以隱藏虛擬代理後面的依賴關係圖部分。看到這裏的概念概述:http://blog.ploeh.dk/2011/03/04/ComposeObjectGraphsWithConfidence.aspx –