为什么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();

我的目标是只在测试期间注册主控制器,并了解我在尝试时做错了什么。

为什么autofac注册apicontroller的所有实例,而不仅仅是我指定的实例

我通过一个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();
            }
        }