为什么autofac注册apicontroller的所有实例,而不仅仅是我指定的实例
本文关键字:实例 不仅仅是 autofac 注册 apicontroller 为什么 | 更新日期: 2023-09-27 17:59:23
我很难理解为什么我从ApiController派生的所有类都已注册并可访问。我有两个ApiControllers:
MasterController : ApiController
SlaveController : ApiController
以下是我如何使用容器设置服务器
Action<IAppBuilder> appBuilderAction = appBuilder => {
var httpConf = new HttpConfiguration();
httpConf.DependencyResolver = new AutofacWebApiDependencyResolver(container);
httpConf.Routes.MapHttpRoute("DefaultApi", "api/v1/{controller}/{action}", new { action = "get" });
appBuilder.UseWebApi(httpConf);
};
return WebApp.Start(baseAddress, appBuilderAction);
创建NUnit测试时遇到的问题是,尽管我只尝试注册一个控制器,但在测试过程中可以访问这两个控制器。例如,如果我只注册主控制器,我希望这个url是有效的(主)
var response = await client.GetAsync(new Uri(http://localhost:8080, "api/v1/master/mytest"));
这个url给我一个404(从)
var response = await client.GetAsync(new Uri(http://localhost:8080, "api/v1/slave/mytest"));
但相反,它们都起作用。我用autofac尝试了所有类型的不同注册,但所有这些似乎都注册了所有的ApiControllers,而不仅仅是我想要的,我缺少什么?
var cb = new ContainerBuilder();
// tried this one and added alot of .where´s to try and filter on it
cb.RegisterApiControllers(typeof (MasterController).Assembly);
// tried many different version, dont have to list them all since obviously im missing something
cb.RegisterType<MasterController>();
cb.RegisterType(typeof(MasterController));
var container = cb.Build();
我的目标是只在测试期间注册主控制器,并了解我在尝试时做错了什么。
我通过一个college发现我戳错了地方,无论我如何设置容器,因为引导它的代码不是DependencyResolver。
在设置服务器时,我在代码中添加了这一行:
httpConf.Services.Replace(typeof(IHttpControllerTypeResolver), new AutofacHttpControllerTypeResolver(container));
这就是我的autofacHttpControllerTypeResolver类的样子:
class AutofacHttpControllerTypeResolver : IHttpControllerTypeResolver
{
private readonly IContainer _container;
public AutofacHttpControllerTypeResolver(IContainer container)
{
this._container = container;
}
public ICollection<Type> GetControllerTypes(IAssembliesResolver assembliesResolver)
{
var q = from r in _container.ComponentRegistry.Registrations
let t = r.Activator.LimitType
where typeof(IHttpController).IsAssignableFrom(t) && t.Name.EndsWith("Controller")
select t;
return q.ToList();
}
}