私はasp.NET MVCアプリケーションでQuartz.Netを使用しようとしています。 UnityとしてDIを使用しています(PerRequestLifeTimeManager
)。Quartz.netのUnity LifeTimeマネージャ
しかし、Quartz.Netは、PerRequestLifeTimeManager
とはうまく動作しません。なぜなら、まずはリクエストがないからです。それを解決しようとする依存関係はnullを返します。
は、私は次のように状況に応じて2つのライフタイムのマネージャーを使用するために、アダプタのようなクラスを作成しました:私はPerThreadLifetimeManager
を試してみた
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();
}
}
、それはその後、最初に、後続の罰金を実行しますメッセージで実行が失敗する
DbContextが に設定されているため、操作を完了できません。エンティティオブジェクトは、私の仕事はと同様に、非常に簡単です IEntityChangeTracker
の複数のインスタンスによって参照することができない私はPerResolveLifeTimeManager
に変更しようとしたが、それは
で失敗
以下:
[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)
{
}
}
Quartzジョブの依存関係の寿命を正しく管理するにはどうすればよいですか?
ありがとうございます。私はまだこの工場をどのように実装するかを完全には把握していませんが、私は明日それについて作業します。例があれば素晴らしいでしょう。 UnityJobFactory内のスコープを開いたり閉じたりすることは可能ですか?このように私は仕事を工場に無知にすることができました。 – Andre