ServiceBuilder.cs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138
  1. using AutoMapper;
  2. using Edge.Core.Configuration;
  3. using Edge.Core.Database;
  4. using Edge.Core.Processor.Dispatcher;
  5. using Edge.Core.Processor.Dispatcher.ProcessorLoader;
  6. using Edge.Core.UniversalApi;
  7. using Edge.Core.UniversalApi.Auditing;
  8. using Microsoft.EntityFrameworkCore;
  9. using Microsoft.Extensions.Configuration;
  10. using Microsoft.Extensions.DependencyInjection;
  11. using Microsoft.Extensions.Logging;
  12. using MQTTnet;
  13. using MQTTnet.Extensions.ManagedClient;
  14. using MQTTnet.Protocol;
  15. using MQTTnet.Server;
  16. using NLog;
  17. using NLog.Extensions.Logging;
  18. using System;
  19. using System.Collections.Generic;
  20. using System.IO;
  21. using System.Linq;
  22. using System.Reflection;
  23. using System.Text;
  24. namespace LiteFccCoreMain.Service
  25. {
  26. internal class ServiceBuilder
  27. {
  28. private static IServiceCollection services;
  29. static ServiceBuilder()
  30. {
  31. }
  32. public void ConfigureServices(IServiceCollection services)
  33. {
  34. }
  35. /// <summary>
  36. /// Build necessary services.
  37. /// </summary>
  38. /// <returns></returns>
  39. public static IServiceProvider Build()
  40. {
  41. services = new ServiceCollection();
  42. #region add the most underlying service: Logging and Configuration(settings.xml) Service
  43. services.AddLogging(loggingBuilder =>
  44. {
  45. // configure Logging with NLog
  46. loggingBuilder.ClearProviders();
  47. loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
  48. var fa = loggingBuilder.AddNLog();
  49. });
  50. // must have below 2 lines
  51. NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration("nlog.config");
  52. NLog.LogManager.LoadConfiguration("nlog.config");
  53. Configurator.Default.LoadAsync().Wait();
  54. services.AddSingleton(Configurator.Default);
  55. #endregion
  56. #region AutoMapper, resolve all assemblies under entry folder.
  57. //var applicationAssFileInfos = new DirectoryInfo(Directory.GetCurrentDirectory())
  58. // .GetFiles().Where(f => //f.Name.ToLower().StartsWith("application") &&
  59. // f.Extension != null
  60. // && (f.Extension.ToLower() == ".dll" || f.Extension.ToLower() == ".exe"));
  61. var assembliesWithAutoMapperProfileDefined = new List<Assembly>();
  62. foreach (var ass in ObjectInstanceCreator.CurrentDomainAssemblies)//applicationAssFileInfos)
  63. {
  64. try
  65. {
  66. //var ass = Assembly.LoadFrom(ai.FullName);
  67. if (ass.GetTypes().Any(t => typeof(Profile).IsAssignableFrom(t)))
  68. assembliesWithAutoMapperProfileDefined.Add(ass);
  69. }
  70. catch
  71. { }
  72. }
  73. services.AddAutoMapper(assembliesWithAutoMapperProfileDefined);
  74. #endregion
  75. /* ServiceLifetime.Transient will make the internal service colletion
  76. * keep reference to all objects and cause memory leak.*/
  77. //services.AddDbContext<SqliteDbContext>(ServiceLifetime.Transient);
  78. services.AddScoped<SqliteDbContext>();
  79. #region Mqtt server setup
  80. //var mqttServer = new MqttFactory().CreateMqttServer();
  81. //services.AddSingleton<IMqttServer>(mqttServer);
  82. #endregion
  83. #region Mqtt client
  84. services.AddTransient<IManagedMqttClient>(p => new MqttFactory().CreateManagedMqttClient());
  85. #endregion
  86. #region UniversalApi
  87. services.AddSingleton(AuditingStoreFactory.Create);
  88. services.AddSingleton(UniversalApiHubFactory.Create);
  89. services.AddSingleton(UniversalApiInvokerFactory.Create);
  90. #endregion
  91. #region IProcessorLoader and IProcessorMetaConfigAccessor
  92. services.AddSingleton(ProcessorLoaderFactory.Create);
  93. services.AddSingleton(ProcessorMetaConfigAccessorFactory.Create);
  94. #endregion
  95. var serviceProvider = services.BuildServiceProvider();
  96. return serviceProvider;
  97. }
  98. //public static IServiceProvider Provider => serviceProvider;
  99. //public static IServiceProvider Build1()
  100. //{
  101. // var services = new ServiceCollection();
  102. // services.AddSingleton<ILoggerFactory, LoggerFactory>();
  103. // //services.AddLogging((builder) => builder.SetMinimumLevel(LogLevel.Trace));
  104. // var serviceProvider = services.BuildServiceProvider();
  105. // var loggerFactory = serviceProvider.GetRequiredService<ILoggerFactory>();
  106. // loggerFactory.ConfigureNLog("testnlog.config");
  107. // return serviceProvider;
  108. //}
  109. }
  110. }