通常,在使用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方法。
答案 0 :(得分:1)
我找到了答案Resolving type with PerRequestLifetimeManager without HTTP request
我必须使用HierarchicalLifetimeManager
然后 改变这个...
GlobalConfiguration.Configuration.DependencyResolver =
new Unity.WebApi.UnityDependencyResolver(container);
对此...
GlobalConfiguration.Configuration.DependencyResolver =
new Unity.WebApi.UnityHierarchicalDependencyResolver(container);