Layer.cs 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Text;
  4. using log4net;
  5. using Quadarax.Foundation.Common.Object;
  6. using StructureMap;
  7. namespace Quadarax.Foundation.Infrastructure.Layers
  8. {
  9. public abstract class Layer : DisposableObject
  10. {
  11. private IContainer _container;
  12. private IList<Layer> _childLayers = new List<Layer>();
  13. private Layer _parentLayer;
  14. protected ILog Log { get; }
  15. public string Name { get; }
  16. public int ChildLayersCount => _childLayers.Count;
  17. public LayerClassificationEnum LayerType { get; protected set; }
  18. protected Layer(string name, Layer parentLayer = null)
  19. {
  20. if (string.IsNullOrEmpty(name))
  21. throw new ArgumentNullException(nameof(name), "Infrastucture layer must have a name.");
  22. _parentLayer = parentLayer;
  23. Log = LogManager.GetLogger(GetType());
  24. Name = name;
  25. InitializeInternal();
  26. Log.Info($"Layer '{Name}' fully created.");
  27. }
  28. private void InitializeInternal()
  29. {
  30. _container = _parentLayer == null ? new Container() : _parentLayer._container.CreateChildContainer();
  31. OnModuleRegistry(_container);
  32. OnLayerRegistry();
  33. Log.Info($"Layer '{Name}' initialization done");
  34. }
  35. protected void AddChildLayer(Layer layer)
  36. {
  37. if (layer==null)
  38. throw new ArgumentNullException(nameof(layer));
  39. _childLayers.Add(layer);
  40. Log.Info($"Layer 'Name' append child layer '{layer.Name}'. Current child count on layer '{Name}' is {ChildLayersCount} childs.");
  41. }
  42. protected abstract void OnLayerRegistry();
  43. protected abstract void OnModuleRegistry(IContainer container);
  44. protected override void OnDisposing()
  45. {
  46. _parentLayer?.Dispose();
  47. _parentLayer = null;
  48. if (_childLayers != null)
  49. {
  50. foreach (var layer in _childLayers)
  51. {
  52. layer.Dispose();
  53. }
  54. }
  55. Log.Info($"Layer '{Name}' disposed.");
  56. }
  57. public TModule Get<TModule>() where TModule : IModule
  58. {
  59. return _container.GetInstance<TModule>();
  60. }
  61. public string Dump()
  62. {
  63. var sb = new StringBuilder();
  64. sb.Append("*** Layer: ").Append(Name).Append(" [").Append(LayerType).Append("] * BEGIN ***").AppendLine();
  65. sb.Append("Parent:").AppendLine();
  66. sb.Append(_parentLayer == null ? "none" : _parentLayer.Name);
  67. sb.AppendLine();
  68. sb.Append("Childs:").AppendLine();
  69. foreach (var child in _childLayers)
  70. sb.Append(child.Dump()).AppendLine();
  71. sb.Append("*** Layer: ").Append(Name).Append(" [").Append(LayerType).Append("] * END ***").AppendLine();
  72. return sb.ToString();
  73. }
  74. }
  75. }