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"
};
好像你在循環中添加攔截擴展多次。現在無法檢查它,因爲我手邊沒有編譯器,但肯定沒有必要。問題是 - 這可能是你放緩的根源嗎? –
很可能。我是攔截的新手,很可能這個解決方案不是最佳的。這只是奇怪,它似乎只是拖拽我們的編輯器模板。其他視圖和部分視圖似乎不受影響。非常感謝您的想法。 –
但基本上,我們需要在所有註冊中註冊截取,但是*之後*已經被加載(不想顯式添加截取,因爲我們希望對所有註冊都進行截取)。所以不知道如何將攔截應用於所有容器註冊,而無需循環並添加它們。 –