我最近在我的 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"
};