یک نکته: روش صحیح Dispose سرویسها داخل وظایف تعریف شده
با توجه به اینکه داخل وظایف، چرخهی طول عمر یک درخواست وب رخ نمیدهد، کار Dispose سرویسهای HybridHttpOrThreadLocalScoped مانند IUnitOfWork را باید دستی انجام دهید:
public static class IoCWrapper
{
public static void RunAndDispose(Action action)
{
try
{
action();
}
finally
{
// اگر در درخواست وب بودیم، به صورت خودکار در پایان کار همه چیز تمام میشود
if (!HttpContextLifecycle.HasContext())
{
new HybridLifecycle().FindCache(null).DisposeAndClear();
}
}
}
public static T GetInstance<T>()
{
return SmObjectFactory.Container.GetInstance<T>();
}
}
و سپس برای استفادهی از آن داخل وظایف:
public override void Run()
{
IoCWrapper.RunAndDispose(() =>
{
var draftsService = IoCWrapper.GetInstance<IBlogPostDraftsService>();
draftsService.RunConvertDraftsToPostsJob();
});
}
به این ترتیب کار Dispose وهلهی Context برنامه به درستی صورت گرفته و هم برنامه دچار نشتی حافظه نخواهد شد و هم Context دریافتی حالت singleton و «کش شده» را پیدا نمیکند (اگر dispose نشود، هربار درخواست آن معادل است با دریافت همان وهلهی قبلی).