Layer.cs 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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 abstract void OnLayerRegistry();
  36. protected abstract void OnModuleRegistry(IContainer container);
  37. protected override void OnDisposing()
  38. {
  39. _parentLayer?.Dispose();
  40. _parentLayer = null;
  41. if (_childLayers != null)
  42. {
  43. foreach (var layer in _childLayers)
  44. {
  45. layer.Dispose();
  46. }
  47. }
  48. Log.Info($"Layer '{Name}' disposed.");
  49. }
  50. public TModule Get<TModule>() where TModule : IModule
  51. {
  52. return _container.GetInstance<TModule>();
  53. }
  54. public string Dump()
  55. {
  56. var sb = new StringBuilder();
  57. sb.Append("*** Layer: ").Append(Name).Append(" [").Append(LayerType).Append("] * BEGIN ***").AppendLine();
  58. sb.Append("Parent:").AppendLine();
  59. sb.Append(_parentLayer == null ? "none" : _parentLayer.Name);
  60. sb.AppendLine();
  61. sb.Append("Childs:").AppendLine();
  62. foreach (var child in _childLayers)
  63. sb.Append(child.Dump()).AppendLine();
  64. sb.Append("*** Layer: ").Append(Name).Append(" [").Append(LayerType).Append("] * END ***").AppendLine();
  65. return sb.ToString();
  66. }
  67. }
  68. }