如何在Web API中使用AutoFac在运行时解析服务?

问题描述 投票:0回答:1

我有一个 API (

eg: ItemController.cs
),它可以在运行时从请求标头获取授权令牌。有了令牌,只有我可以进入我的服务类 (
eg: ServiceItem.cs
)。

我就是这样做的。

  1. 在 Startup.cs 中,我注册了我的 ServiceItem

    var builder = new ContainerBuilder();
    builder.RegisterType<ServiceItem>();
    container = builder.Build(); //Note that, my container is a static variable
    
  2. 在我的API中,我是这样解决的:

    [Authorize]
    [Route("GetData")]
    [HttpGet]
    public IHttpActionResult GetData([FromUri] Filter filter)
    {
     using (var scope = Startup.container.BeginLifetimeScope())
     {
        var serviceItem = Startup.container.Resolve<ServiceItem>(
                new NamedParameter("token", Request.GetHeader("Authorization"))
            );
        return Ok(serviceItem.getItem(filter)); //filter is a param from webAPI
     }
    }
    

问题:

Autofac 在 Web API 中通常是这样工作的吗?首先,我使用全局静态

IContainer
。其次,如果我公开更多的函数,代码看起来会重复。

我正在考虑解决API构造函数中的

ServiceItem
。但授权令牌尚未可用。

如有任何建议,我们将不胜感激。

附注:

这是我的

ServiceItem
,在构造函数中,有一个参数“token”

     public class ServiceItem
     {
          public string token;
          public ServiceItem(string token)
          {
              this.token = token;
          }

          public void doSomething()
          {
              //based on token, do processing
          }
      }
c# runtime autofac webapi
1个回答
3
投票

在启动类中引用静态容器是一个坏主意。这样,您就可以在控制器和启动之间引入紧密耦合。您的控制器依赖项应该由构造函数参数来满足。访问 http://docs.autofac.org/en/v4.0.0/integration/aspnetcore.html

Startup.ConfigureServices
方法可以选择返回一个
IServiceProvider
实例,它允许您将Autofac插入到ASP.NET Core依赖注入框架中:

public IServiceProvider ConfigureServices(IServiceCollection services)
{
  services.AddMvc();

  var builder = new ContainerBuilder();

  builder.RegisterType<MyType>().As<IMyType>();
  builder.Populate(services);
  this.ApplicationContainer = builder.Build();

  return new AutofacServiceProvider(this.ApplicationContainer);
}

初始化容器后,构造函数参数将由 Autofac 自动解析:

public class MyController
{
    private readonly IMyType theType;
    public MyController(IMyType theType)
    {
        this.theType = theType; 
    }

    ....
}
© www.soinside.com 2019 - 2024. All rights reserved.