我想在一個asp.NET MVC應用程序中使用Quartz.Net。我使用Unity作爲DI,並使用PerRequestLifeTimeManager
。Quartz.net的統一生命週期管理器
然而,Quartz.Net不能與PerRequestLifeTimeManager
一起使用,因爲它沒有開始的請求。我試圖用它解決的任何依賴項都返回null。
我創建了一個類像一個適配器使用根據上下文兩項終生的時間管理者如下:
class CustomLifetimeManager : LifetimeManager
{
private readonly string _key = "CustomLifetimeManagerKey" + Guid.NewGuid();
private readonly PerResolveLifetimeManager _perResolveLifetimeManager = new PerResolveLifetimeManager();
private bool IsWebContext => HttpContext.Current != null;
public override object GetValue()
{
return IsWebContext
? HttpContext.Current.Items[_key]
: _perResolveLifetimeManager.GetValue();
}
public override void SetValue(object newValue)
{
if (IsWebContext)
HttpContext.Current.Items[_key] = newValue;
else
_perResolveLifetimeManager.SetValue(newValue);
}
public override void RemoveValue()
{
if (IsWebContext)
HttpContext.Current.Items[_key] = null;
else
_perResolveLifetimeManager.RemoveValue();
}
}
我試過PerThreadLifetimeManager
,它執行罰款的第一次,那麼後續執行失敗,並顯示消息
該操作無法完成,因爲DbContext已處理了 。
我試圖改變到PerResolveLifeTimeManager
,但它失敗
的實體對象不能由 多個實例IEntityChangeTracker
引用
我的工作是非常簡單的,類似如下:
[DisallowConcurrentExecution]
class MyJob
{
IFooRepository _fooRepository;
IBarRepository _barRepository;
public MyJob(IFooRepository fooRepository, IBarRepository barRepository)
{
_fooRepository = fooRepository;
_barRepository = barRepository;
}
public void Execute(IJobExecutionContext context)
{
var foos = _fooRepository.Where(x => !x.Processed);
foreach(var foo in foos)
{
var bar = _barRepository.Where(x => x.Baz == foo.Baz);
foo.DoMagic(bar);
foo.Processed = true;
_fooRepository.Save(foo);
}
}
}
而我的作業工廠是
public class UnityJobFactory : IJobFactory
{
private readonly IUnityContainer _container;
public UnityJobFactory(IUnityContainer container)
{
_container = container;
}
public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler)
{
return (IJob)_container.Resolve(bundle.JobDetail.JobType);
}
public void ReturnJob(IJob job)
{
}
}
如何正確管理石英工作中的依賴項生命時間?
感謝您的解釋。我還沒有完全掌握如何實施這家工廠,但我明天就會着手。如果你有任何的例子,那就太好了。是否可以在我的UnityJobFactory中打開和關閉這些範圍?這樣我就可以讓工作對工廠無知了。 – Andre