Repositorys.cs 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. using Autofac;
  2. using System.Reflection;
  3. using SHJX.Service.Control.Proxy;
  4. using Autofac.Extras.DynamicProxy;
  5. using SHJX.Service.Control.Extends;
  6. using SHJX.Service.Control.Common.Assets;
  7. using SHJX.Service.Control.Pipeline.Contents;
  8. using shjxCamera;
  9. namespace SHJX.Service.Control.Repository
  10. {
  11. public class Repositorys
  12. {
  13. #region Private Fields
  14. private static IEventAggregator _ea;
  15. private static IDataManager _dataManager;
  16. private static ReadConfigUtil _readConfig;
  17. private static EaseScheduler.IScheduler _scheduler;
  18. #endregion
  19. #region Public Properties
  20. public static IContainer Container { get; set; }
  21. #endregion
  22. public Repositorys(IEventAggregator ea, IDataManager dataManager, ReadConfigUtil readConfig, EaseScheduler.IScheduler scheduler)
  23. {
  24. _ea = ea;
  25. _readConfig = readConfig;
  26. _dataManager = dataManager;
  27. _scheduler = scheduler;
  28. }
  29. #region 任务继续
  30. public void ExecuteTaskByVirtualPipe(string type, EquipmentTask task)
  31. {
  32. using ILifetimeScope scope = Container.BeginLifetimeScope();
  33. PipelineConfig config = scope.Resolve<PipelineConfig>();
  34. List<string> CurrentNodes = new();
  35. foreach (PipelineContent item in from PipelineContent item in config.PipelineContents where item.Alias.Equals(type) select item)
  36. {
  37. CurrentNodes = item.Nodes;
  38. }
  39. IPipeline pipeline = scope.ResolveNamed<IPipeline>("VirtualPipeline");
  40. int index = string.IsNullOrWhiteSpace(task.Record) ? 0 : CurrentNodes.FindLastIndex(it => it.Equals(task.Record));
  41. CurrentNodes.Skip(index + 1).ToList().ForEach(node =>
  42. {
  43. pipeline.AddNode(scope.ResolveNamed<INode>(node));
  44. });
  45. pipeline.Invoke(task);
  46. }
  47. public void ExecuteTaskByVirtualPipe(EquipmentTask task)
  48. {
  49. using ILifetimeScope scope = Container.BeginLifetimeScope();
  50. PipelineConfig config = scope.Resolve<PipelineConfig>();
  51. List<string> CurrentNodes = new();
  52. foreach (PipelineContent item in from PipelineContent item in config.PipelineContents where item.Alias.Equals(task.RouteStep) select item)
  53. {
  54. CurrentNodes = item.Nodes;
  55. }
  56. IPipeline pipeline = scope.ResolveNamed<IPipeline>("VirtualPipeline");
  57. int index = task.Target.Equals(nameof(task.From)) ? CurrentNodes.FindIndex(it => it.Equals(task.Record)) : CurrentNodes.FindLastIndex(it => it.Equals(task.Record));
  58. CurrentNodes.Skip(index + 1).ToList().ForEach(node =>
  59. {
  60. pipeline.AddNode(scope.ResolveNamed<INode>(node));
  61. });
  62. pipeline.Invoke(task);
  63. }
  64. public void ExecuteTaskByVirtualPipe(EquipmentTask task, List<string> steps)
  65. {
  66. using ILifetimeScope scope = Container.BeginLifetimeScope();
  67. IPipeline pipeline = scope.ResolveNamed<IPipeline>("VirtualPipeline");
  68. steps.ForEach(step =>
  69. {
  70. pipeline.AddNode(scope.ResolveNamed<INode>(step));
  71. });
  72. pipeline.Invoke(task);
  73. }
  74. #endregion
  75. public void InitializationBean()
  76. {
  77. using ILifetimeScope scope = Container.BeginLifetimeScope();
  78. scope.Resolve<shjxCamera.Globals>();
  79. scope.Resolve<CalculationResult>();
  80. scope.Resolve<TaskRuntime>();
  81. scope.Resolve<PipeContent>();
  82. scope.Resolve<PortProducerFactory>();
  83. scope.Resolve<ConfigInstance>();
  84. scope.Resolve<DataManagerInstance>();
  85. scope.Resolve<ExecuteCommand>();
  86. foreach (Type scheduler in Assembly.GetAssembly(GetType()).GetExportedTypes().Where(type => typeof(IScheduler).IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract))
  87. {
  88. scope.ResolveNamed<IScheduler>(scheduler.Name);
  89. };
  90. }
  91. public void StartTaskProcesser()
  92. {
  93. _scheduler.Start();
  94. }
  95. #region Register
  96. public void RegisterContainer()
  97. {
  98. ContainerBuilder builder = new();
  99. RegistSingletonType(ref builder);
  100. RegistPipeNodes(ref builder);
  101. RegistFromAppType(ref builder);
  102. RegistConfig(ref builder);
  103. RegistInterface<IPipeline>(ref builder);
  104. RegistInterface<IScheduler>(ref builder);
  105. Container = builder.Build();
  106. }
  107. private void RegistSingletonType(ref ContainerBuilder builder)
  108. {
  109. builder.RegisterType<Globals>();
  110. builder.RegisterType<OptCommand>();
  111. builder.RegisterType<TaskExtend>();
  112. builder.RegisterType<PipeContent>();
  113. builder.RegisterType<TaskRuntime>();
  114. builder.RegisterType<CalculationResult>();
  115. builder.RegisterType<ConfigInstance>();
  116. builder.RegisterType<ExecuteCommand>();
  117. builder.RegisterType<PortProducerFactory>();
  118. builder.RegisterType<AopInterceptor>();
  119. builder.RegisterType<DataManagerInstance>();
  120. }
  121. private void RegistFromAppType(ref ContainerBuilder builder)
  122. {
  123. builder.Register(it => _ea).As<IEventAggregator>();
  124. builder.Register(it => _dataManager).As<IDataManager>();
  125. }
  126. private void RegistConfig(ref ContainerBuilder builder)
  127. {
  128. PipelineConfig config = PipelineConfig.Instance;
  129. builder.Register(it => config).As<PipelineConfig>();
  130. builder.Register(it => _readConfig).As<ReadConfigUtil>();
  131. }
  132. private void RegistPipeNodes(ref ContainerBuilder builder)
  133. {
  134. Assembly assem = GetType().GetTypeInfo().Assembly;
  135. builder.RegisterAssemblyTypes(assem)
  136. .Where(type => typeof(INode).IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract)
  137. .AsImplementedInterfaces()
  138. .InstancePerDependency()
  139. .Named<INode>(it => it.Name)
  140. .EnableClassInterceptors()
  141. .InterceptedBy(typeof(AopInterceptor));
  142. }
  143. private void RegistInterface<T>(ref ContainerBuilder builder)
  144. {
  145. builder.RegisterAssemblyTypes(AppDomain.CurrentDomain.GetAssemblies())
  146. .Where(type => typeof(T).IsAssignableFrom(type) && !type.GetTypeInfo().IsAbstract)
  147. .AsImplementedInterfaces()
  148. .Named<T>(it => it.Name)
  149. .InstancePerDependency();
  150. }
  151. #endregion
  152. }
  153. }