【发布时间】:2018-07-23 22:22:15
【问题描述】:
通常在我使用Unity 作为依赖框架的 ASP.NET MVC 应用程序中,我使用PerRequestLifetimeManager,它会在 HTTP 请求完成时处理所有依赖关系。
现在我将 Hangfire 配置到 ASP.NET 应用程序中。 Hangfire 调度一个依赖于DBContext 的后台作业。如下所示
(IGenericRepository 使用 DBContext,但为简洁起见,此处未显示代码)
public interface IMyService:IDisposable
{
void DoWork();
}
public class MyService : IMyService
{
private bool _disposed = false;
protected readonly IGenericRepository _repository = null;
public MyService(IGenericRepository repository)
{
_repository = repository ?? throw new ArgumentNullException(nameof(repository));
}
public void DoWork()
{
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected virtual void Dispose(bool disposing)
{
if (_disposed)
return;
if (disposing)
{
if (_repository != null)
{
_repository.Dispose();
}
// Free any other managed objects here.
}
// Free any unmanaged objects here.
_disposed = true;
}
}
}
然后在应用程序启动时,我注册一个重复的工作,如下所示
RecurringJob.AddOrUpdate<IMyService>(x => x.DoWork(), Cron.Hourly());
我知道我不能使用PerRequestLifetimeManager,因为当 Hangfire 安排后台作业时不会有 HttpContext 可用。
但我想知道我应该在这里使用什么生命周期管理器来注册 IGenericRepository 和 IMyService 以便在工作完成后立即隐式调用 Dispose 方法。
【问题讨论】:
标签: asp.net asp.net-mvc-5 unity-container hangfire hangfire-unity