using AutoMapper;
using Edge.Core.Configuration;
using Edge.Core.Database;
using Edge.Core.Processor.Dispatcher;
using Edge.Core.Processor.Dispatcher.ProcessorLoader;
using Edge.Core.UniversalApi;
using Edge.Core.UniversalApi.Auditing;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using MQTTnet;
using MQTTnet.Extensions.ManagedClient;
using MQTTnet.Protocol;
using MQTTnet.Server;
using NLog;
using NLog.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Text;
namespace LiteFccCoreMain.Service
{
internal class ServiceBuilder
{
private static IServiceCollection services;
static ServiceBuilder()
{
}
public void ConfigureServices(IServiceCollection services)
{
}
///
/// Build necessary services.
///
///
public static IServiceProvider Build()
{
services = new ServiceCollection();
#region add the most underlying service: Logging and Configuration(settings.xml) Service
services.AddLogging(loggingBuilder =>
{
// configure Logging with NLog
loggingBuilder.ClearProviders();
loggingBuilder.SetMinimumLevel(Microsoft.Extensions.Logging.LogLevel.Trace);
var fa = loggingBuilder.AddNLog();
});
// must have below 2 lines
NLog.LogManager.Configuration = new NLog.Config.XmlLoggingConfiguration("nlog.config");
NLog.LogManager.LoadConfiguration("nlog.config");
Configurator.Default.LoadAsync().Wait();
services.AddSingleton(Configurator.Default);
#endregion
#region AutoMapper, resolve all assemblies under entry folder.
//var applicationAssFileInfos = new DirectoryInfo(Directory.GetCurrentDirectory())
// .GetFiles().Where(f => //f.Name.ToLower().StartsWith("application") &&
// f.Extension != null
// && (f.Extension.ToLower() == ".dll" || f.Extension.ToLower() == ".exe"));
var assembliesWithAutoMapperProfileDefined = new List();
foreach (var ass in ObjectInstanceCreator.CurrentDomainAssemblies)//applicationAssFileInfos)
{
try
{
//var ass = Assembly.LoadFrom(ai.FullName);
if (ass.GetTypes().Any(t => typeof(Profile).IsAssignableFrom(t)))
assembliesWithAutoMapperProfileDefined.Add(ass);
}
catch
{ }
}
services.AddAutoMapper(assembliesWithAutoMapperProfileDefined);
#endregion
/* ServiceLifetime.Transient will make the internal service colletion
* keep reference to all objects and cause memory leak.*/
//services.AddDbContext(ServiceLifetime.Transient);
services.AddScoped();
#region Mqtt server setup
//var mqttServer = new MqttFactory().CreateMqttServer();
//services.AddSingleton(mqttServer);
#endregion
#region Mqtt client
services.AddTransient(p => new MqttFactory().CreateManagedMqttClient());
#endregion
#region UniversalApi
services.AddSingleton(AuditingStoreFactory.Create);
services.AddSingleton(UniversalApiHubFactory.Create);
services.AddSingleton(UniversalApiInvokerFactory.Create);
#endregion
#region IProcessorLoader and IProcessorMetaConfigAccessor
services.AddSingleton(ProcessorLoaderFactory.Create);
services.AddSingleton(ProcessorMetaConfigAccessorFactory.Create);
#endregion
var serviceProvider = services.BuildServiceProvider();
return serviceProvider;
}
//public static IServiceProvider Provider => serviceProvider;
//public static IServiceProvider Build1()
//{
// var services = new ServiceCollection();
// services.AddSingleton();
// //services.AddLogging((builder) => builder.SetMinimumLevel(LogLevel.Trace));
// var serviceProvider = services.BuildServiceProvider();
// var loggerFactory = serviceProvider.GetRequiredService();
// loggerFactory.ConfigureNLog("testnlog.config");
// return serviceProvider;
//}
}
}