【发布时间】:2018-08-31 12:07:20
【问题描述】:
我有一个 API (eg: ItemController.cs),它将在运行时从请求标头中获取授权令牌。使用令牌,然后只有我进入我的服务类 (eg: ServiceItem.cs)。
我就是这样做的。
-
在 Startup.cs,我注册了我的 ServiceItem
var builder = new ContainerBuilder(); builder.RegisterType<ServiceItem>(); container = builder.Build(); //Note that, my container is a static variable -
在我的 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,在构造函数中,有一个参数“令牌”
public class ServiceItem
{
public string token;
public ServiceItem(string token)
{
this.token = token;
}
public void doSomething()
{
//based on token, do processing
}
}
【问题讨论】:
-
您需要将DependencyResolver设置为AutoFac容器。
-
@john 感谢您指出依赖解析器。我还在Autofac Doc 中找到了它。顺便问一下,运行时如何解决?
-
你可以把你需要的服务放在控制器构造函数中。
-
现在我理解并测试了。通过使用 DependencyResolver,它避免了在我的示例中使用“静态”变量。但是,不确定我是否弄错了什么。这只有在我的
ServiceItem没有参数时才有效。如果我想使用运行时信息(例如来自请求标头的令牌)来解析服务,它是如何执行的? -
你可以创建delegate factories并注入它们。
标签: c# api web runtime autofac