【问题标题】:Disposing dependencies in ASP.NET application with Hangfire使用 Hangfire 在 ASP.NET 应用程序中处理依赖项
【发布时间】: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 可用。 但我想知道我应该在这里使用什么生命周期管理器来注册 IGenericRepositoryIMyService 以便在工作完成后立即隐式调用 Dispose 方法。

【问题讨论】:

    标签: asp.net asp.net-mvc-5 unity-container hangfire hangfire-unity


    【解决方案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);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多