0

我最近在我的 MVC 应用程序中添加了 Unity Interception,在引导代码中使用以下内容:

    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"
};
4

1 回答 1

1

您似乎在循环中多次添加拦截扩展。现在无法检查它,因为我手头没有编译器,但肯定没有必要。问题是——这可能是你放缓的根源吗?

(经过简短讨论后,按照OP的建议作为答案发布)

于 2013-07-14T20:27:12.090 回答