C# Unity拦截(AOP)降低MVC编辑器模板的速度
我最近在我的MVC应用程序中添加了Unity拦截,在引导代码中使用了以下内容: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(
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"
};