在WebApi2中使用Autofac范围

时间:2017-08-15 23:52:47

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

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

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

但是,我正在撰写var tempProduct = (from p in ctx.Products.Include("ProductPrimaryPrices").Include("ProductSecondaryPrices") select new { ProductId = p.ProductId, Code = p.Code, Name = p.Name, Description = p.Description, ProductPrimaryPrices = p.ProductPrimaryPrices, ProductSecondaryPrices = p.ProductSecondaryPrices } ).ToList();

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

但是 - 虽然它有效 - 似乎关闭了范围并阻止我的Controller甚至正确初始化。

我能做到:

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); } 会被处理掉吗?

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

1 个答案:

答案 0 :(得分:1)

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