我已经阅读了大部分文档,但我仍然不确定依赖范围的具体用法。
当我的请求到达我的控制器时,我通常可以使用控制器的依赖关系(通过构造函数注入提供)而不用担心自己。
但是,我正在撰写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示例,这对我有很大帮助。
答案 0 :(得分:1)
为您创建请求级别依赖关系范围并为您处理。只需获取它(不在using
内)并在需要时解决它。当然,确保Autofac中间件在中间件之前执行,以便为您创建范围;如果是这样的话,它也会在你之后清理。自动。