C# Unity拦截(AOP)降低MVC编辑器模板的速度

C# Unity拦截(AOP)降低MVC编辑器模板的速度,c#,asp.net-mvc,unity-container,aop,C#,Asp.net Mvc,Unity Container,Aop,我最近在我的MVC应用程序中添加了Unity拦截,在引导代码中使用了以下内容: private static void RegisterProfilingHooks(IUnityContainer container) { var registrations = container.Registrations.Where(m => m.RegisteredType != m.MappedToType).Where(

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

    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());
    }
我仍然有同样的时间

我不知道这个截取是否会导致我们的视图搜索被拖拽,或者是什么。这是我现在唯一能想到的。我们的视图路径定义非常简单:

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

看起来您在循环中多次添加拦截扩展。现在无法检查它,因为我手头没有编译器,但它肯定不是必需的。问题是——这可能是你减速的原因吗


(作为OP在简短讨论后建议的答案发布)

您似乎在循环中多次添加拦截扩展。现在无法检查它,因为我手头没有编译器,但它肯定不是必需的。问题是——这可能是你减速的原因吗?很可能。我对拦截还不熟悉,很可能这个解决方案不是最优的。奇怪的是,它似乎只是在拖拽我们的编辑器模板。其他视图和局部视图似乎不受影响。非常感谢您的想法。但基本上,我们需要在所有注册上注册拦截,但在它们已经加载之后(不想显式添加拦截,因为我们希望所有注册都这样)。因此,不确定如何在不循环并添加它们的情况下对所有容器注册应用拦截。只需将AddNewExtension移到循环之外,验证这是否会导致速度减慢,并手动配置拦截(即使是单个类型)。如果减速消失了,你肯定会遇到另一个小问题,那就是很容易地将拦截应用到所有注册中,但至少减速不会再让你丧命。目前大约有250多个注册(这是一个大型的多团队网站)。您可以看到上面的
Take(150)
,这是为了查看注册数量是否影响计时。似乎在一个点之后,它们开始稳定地增加(不是突然增加)。我不知道为什么
AddNewExtension
会在循环中结束——它原来就在上面。试试看这是否有用。
@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"
};