Autofac-装饰特定装配体中的所有零部件

时间:2019-01-07 16:58:12

标签: c# asp.net dependency-injection autofac

因此,我想对一堆从System.Web.Http.ApiController继承的控制器进行性能分析。在进行概要分析的项目中,我们正在使用

进行注册
builder.RegisterApiControllers(typeof(Web.Modules.AutofacModule).Assembly)
    .As(type => new Autofac.Core.KeyedService("api", type));

稍后,我正在尝试为每个人注册一个装饰器

builder.RegisterDecorator<ApiController>(original => Decorate(original, profiler), 
    fromKey: "api");

其中Decorate通过DelegatingHandler注入一些配置文件代码并返回原始代码。

我可以很好地解析控制器:

scope.ResolveKeyed<RegistrationController>("api");

但是永远不会调用概要分析代码,Decorate也不会被调用。

我首先想到的是,也许我需要将控制器组件注册为ApiController,但是将.As<ApiController>()放在第一个代码片段的下面并不成功。

任何帮助都是超级帮助。这可能归结为我缺乏Autofac-fu。

1 个答案:

答案 0 :(得分:0)

  

所以我想对继承自System.Web.Http.ApiController的一堆控制器进行一些分析。

这是不可能的。这与Autofac无关,而与ASP.NET Web API的设计方式有关。

即使Web API控制器派生自公共基类,ASP.NET Web API仍需要使用原始控制器类型。换句话说,当它从CREATE请求一个HomeController时,它希望使用的是确切类型(或子类型),而不是兄弟类型(另一个IHttpControllerActivator派生类型)。

我认为存在此限制是因为Web API使用反射来查找实际的操作方法。但是,当您返回装饰器时,这些方法就消失了,因为装饰器将应用合成而不是继承。这与ASP.NET MVC的设计有很大不同。实际上,MVC确实允许修饰控制器,因为它总是调用ApiController方法。因此,实现IController.Execute是MVC对控制器的唯一要求。

因此,即使将Autofac配置为在Decorator中包装任何IController派生类,Web API也绝对不会允许您。

围绕Web API中的操作方法调用应用交叉关注点的方法是通过使用委托处理程序。