2013-07-14 36 views
0

我最近增加團結攔截到我的MVC應用程序,使用的引導代碼如下:團結攔截(AOP)減慢MVC編輯模板

private static void RegisterProfilingHooks(IUnityContainer container) 
    { 
     var registrations = 
      container.Registrations.Where(m => m.RegisteredType != m.MappedToType).Where(
       m => m.RegisteredType.Name != "IProfilingService").Take(150).ToList(); 

     foreach (var registration in registrations) 
     { 
      container.AddNewExtension<Interception>().Configure<Interception>().SetInterceptorFor(
       registration.RegisteredType, new InterfaceInterceptor()); 
     } 

     container.Configure<Interception>() 
      .AddPolicy("ProfilerPolicy") 
      .AddMatchingRule<NamespaceMatchingRule>(
       new InjectionConstructor(new InjectionParameter("MyApp.*"))) 
      .AddCallHandler<ProfilerHandler>(new ContainerControlledLifetimeManager()); 
    } 

然而,奇怪的是我看到我的編輯模板取每個編輯器模板大約2秒(之前,僅爲毫秒)加載。因此,一個包含10個元素的表單需要10秒才能加載。

基本上,這段代碼只是爲了攔截所有IoC註冊中的剖析處理程序,以便我們可以剖析在這些實例上調用的任何方法。

問題不在於探查器處理程序,因爲即使在註釋掉ProfilerPolicy配置時,也會發生這種情況。

這是foreach循環,並且導致這延長佈線:

foreach (var registration in registrations) 
{ 
    container.AddNewExtension<Interception>().Configure<Interception>().SetInterceptorFor(
     registration.RegisteredType, new InterfaceInterceptor()); 
} 

爲什麼會這樣攔截代碼在我的編輯模板這個奇特的效果?

附加信息:

我已經排除了任何對自己造成這種模板,因爲我已經更新了他們是基本的快速導入,仍然看到了問題。例如,將其用作字符串模板:

@model System.String 
@Html.TextBoxFor(m => m) 

我仍然得到相同的計時。

我不知道這種截取是否導致我們的視圖搜索拖動,或什麼。這是我現在可以想到的唯一一件事情。我們的視圖路徑定義非常簡單:

AreaPartialViewLocationFormats = new[] { 
    "~/Areas/{2}/Views/Sublayouts/{1}/{0}.cshtml", 
    "~/Areas/{2}/Views/Renderings/{1}/{0}.cshtml", 
    "~/Areas/Global/Views/Shared/{0}.cshtml" 
}; 
+0

好像你在循環中添加攔截擴展多次。現在無法檢查它,因爲我手邊沒有編譯器,但肯定沒有必要。問題是 - 這可能是你放緩的根源嗎? –

+0

很可能。我是攔截的新手,很可能這個解決方案不是最佳的。這只是奇怪,它似乎只是拖拽我們的編輯器模板。其他視圖和部分視圖似乎不受影響。非常感謝您的想法。 –

+0

但基本上,我們需要在所有註冊中註冊截取,但是*之後*已經被加載(不想顯式添加截取,因爲我們希望對所有註冊都進行截取)。所以不知道如何將攔截應用於所有容器註冊,而無需循環並添加它們。 –

回答

1

看起來好像在循環中多次添加了攔截擴展。現在無法檢查它,因爲我手邊沒有編譯器,但肯定沒有必要。問題是 - 這可能是你放緩的根源嗎?

(發佈作爲一個答案,一個簡短的討論後,由OP建議)