InMemoryStorageProvider.cs 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. using System.Collections.Concurrent;
  2. using Quadarax.Foundation.Core.Business.Processor.Dependencies.Value.Extensions;
  3. using Quadarax.Foundation.Core.Business.Processor.Enums;
  4. using Quadarax.Foundation.Core.Business.Processor.Task;
  5. using Quadarax.Foundation.Core.Data;
  6. using Quadarax.Foundation.Core.Data.Extensions;
  7. using Quadarax.Foundation.Core.Object;
  8. namespace Quadarax.Foundation.Core.Business.Processor.Providers
  9. {
  10. public class InMemoryStorageProvider : ProcessorStorageProvider
  11. {
  12. #region *** Private fields ***
  13. private readonly IDictionary<long, ITaskItemData> _cache = new ConcurrentDictionary<long, ITaskItemData>();
  14. #endregion
  15. #region *** Overrides ***
  16. protected override void OnDisposing()
  17. {
  18. _cache.Clear();
  19. }
  20. public override IQueryable<ITaskItemData> Query(IPaging paging, params ProcessStatusEnum[] statuses)
  21. {
  22. return _cache.Values.Where(x=>x.Status.In(statuses)).AsQueryable().Page(paging);
  23. }
  24. protected override void OnOpen()
  25. {
  26. }
  27. protected override void OnClose()
  28. {
  29. }
  30. protected override bool OnEnsureStorage()
  31. {
  32. return false;
  33. }
  34. protected override ITaskIdentifier OnCreate(ITaskItemData item)
  35. {
  36. var id = GetNextId();
  37. ((TaskItem)item).Id = id;
  38. _cache.TryAdd(id, item);
  39. return item;
  40. }
  41. protected override ITaskItemData[] OnGet(ITaskIdentifier[] ids)
  42. {
  43. var result = ids.Select(id => _cache[id.Id]).ToList();
  44. return result.ToArray();
  45. }
  46. protected override void OnDeleteOne(ITaskItemData item)
  47. {
  48. _cache.Remove(item.Id);
  49. }
  50. protected override void OnSetOne(ITaskItemData item)
  51. {
  52. var existing = (TaskItem) _cache[item.Id];
  53. existing.CopyFrom(item);
  54. }
  55. #endregion
  56. #region *** Private operations ***
  57. private long GetNextId()
  58. {
  59. return _cache.Keys.Any() ? _cache.Keys.Max() + 1 : 1;
  60. }
  61. #endregion
  62. }
  63. }