我在一个由owin驱动的web api项目中使用autofac。我来到了一个我需要的地方" Fire and Forget"一些数据处理。
这通常不是问题。但是,由于依赖关系是由autofac中间件管理的每请求生命周期范围控制的。我不能在我期待已久的async
方法中使用未管理的资源(这是我需要做的)。
//for example...
public async Task<IEnumerable<MyThings>> GetThings(){
var things = await _thingRepo.GetInterestingThingsAsync();
//fire and forget. -- not awaiting
InjectedObject.DoThingsAsync(things);
return things;
}
这里的问题是我需要在DoThingsAsync
内使用其他注入资源(非托管资源)。目前,这会因为Owin请求结束时被处置而中断。
我可以为每次调用创建一个子生命周期范围,但我希望他们可能更清洁地做这些事情。
答案 0 :(得分:2)
<强>更新强>:
随着.Net Framework 4.5.2的出现,我现在可以使用
了 HostingEnvironment.QueueBackgroundWorkItem
哪个是首选因为它会在工作项完成之前阻止IIS回收。
我想我为我的用例找到了一个解决方案..
我只是在需要它的地方注入这个课程:
public class AsyncTask : IAsyncTask
{
private ILifetimeScope _lifetimeScope;
public AsyncTask(ILifetimeScope lifeTimeScope)
{
//disposed of by owning scope...
_lifetimeScope = lifeTimeScope;
}
public async Task Fire<T>(Func<T,Task> asyncAction)
{
using (var scope = _lifetimeScope.BeginLifetimeScope())
{
await asyncAction(scope.Resolve<T>());
}
}
}
public interface IAsyncTask
{
Task Fire<T>(Func<T, Task> action);
}
然后..
_asyncTask.Fire<IEmailService>(svc => svc.SendMillionsOfEmailsAsync(content));