如何使用AutoFac在网页API来解决在运行时服务?(How to use AutoFac in

2019-09-27 14:41发布

我有一个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 。 二,代码重复一下,如果我揭露一些更多的功能。

我想解决这个ServiceItem在API的构造。 但授权令牌还不可用。

任何建议表示赞赏。

PS:

这里是我的ServiceItem其中,在构造函数中,有一个PARAM“令牌”

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

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

Answer 1:

这是一个坏主意,是指你的启动类中的静态容器。 这样一来,你介绍控制器和启动之间的紧耦合。 控制器的依赖应该由构造函数的参数来满足。 快来看看http://docs.autofac.org/en/v4.0.0/integration/aspnetcore.html

Startup.ConfigureServices方法可以选择返回一个IServiceProvider实例,它可以让你插件Autofac到ASP.NET核心的依赖注入框架:

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

    ....
}


文章来源: How to use AutoFac in Web API to resolve a service at runtime?