【问题标题】:Using Autofac scopes in WebApi2在 WebApi2 中使用 Autofac 范围
【发布时间】:2017-08-15 23:52:47
【问题描述】:

我已经阅读了大部分文档,但我仍然不确定依赖范围的具体用法。

当我的请求到达我的控制器时,我通常可以使用控制器的依赖项(通过构造函数注入提供)而不必太担心。

不过,我写的是Delegating Handler

public class MyHandler: DelegatingHandler
    protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request,
        CancellationToken cancellationToken)
    {
        // I need IMyService here
        return await base.SendAsync(request, cancellationToken);
    }

我最初尝试过这样做:

using(var scope = request.GetDependencyScope()){
    var service = scope.GetService(typeof(IMyService));
}

但这 - 虽然它有效 - 似乎关闭了范围并阻止我的控制器甚至无法正确初始化。

我能做到:

{
      var requestScope = request.GetDependencyScope();
      var scope = requestScope.GetRequestLifetimeScope();

      var service = scope.Resolve<IMyService>();
      // use service
      return await base.SendAsync(request, cancellationToken);
}

但这不会造成资源泄漏吗?请求完成后,RequestLifetimeScope 会被销毁吗?

如果您可以为我提供使用 Autofac 解析服务的正确、最佳实践风格的基本 DelegatingHandler 示例,那将对我有很大帮助。

【问题讨论】:

    标签: c# asp.net dependency-injection asp.net-web-api2 autofac


    【解决方案1】:

    请求级别的依赖范围是为您创建并为您处置的。只需获取它(不在using 内)并在需要时解决它。当然,请确保 Autofac 中间件在您的中间件之前执行,以便为您创建范围;如果是这样,它也会在你之后清理。自动。

    【讨论】:

    • 我已经尝试了“我可以做”的代码,它似乎工作正常。如果我理解正确,这是解决我的服务的正确方法吗?
    • 我只想 GetDependencyScope 并从那里解决,但是,如果你必须做服务定位而不是 DI,那就是这样。请注意,这不是 Autofac 特定的 - 这就是 Web API 的工作方式。
    猜你喜欢
    • 2018-02-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多