繁体   English   中英

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

[英]How to use AutoFac in Web API to resolve a service at runtime?

我有一个API( eg: ItemController.cs ),它将在运行时从请求标头获取授权令牌。 使用Token,只有我传入我的服务类( 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 但授权令牌尚不可用。

任何建议表示赞赏。

PS:

这是我的ServiceItem ,它在构造函数中有一个参数'token'

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

          public void doSomething()
          {
              //based on token, do processing
          }
      }

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

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

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; 
    }

    ....
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM