using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using System.Reflection;
using System.Text;
using Console = Colorful.Console;
namespace BotSharp.Core.Modules
{
///
/// Startup class for configurable modules
///
public class ModulesStartup
{
private readonly IEnumerable _modules;
private readonly IConfiguration _configuration;
///
/// Create an instance of
///
///
/// Application configuration containing modules configuration
///
public ModulesStartup(IConfiguration configuration)
{
this._configuration = configuration ??
throw new ArgumentNullException(nameof(configuration));
ModulesOptions options = configuration.Get();
this._modules = options.Modules
.Select(s =>
{
Type type = Type.GetType($"{s.Type}.ModuleInjector, {s.Type}");
if (type == null)
{
/* hard to debug in docker */
/* throw new TypeLoadException(
$"Cannot load type \"{s.Type}\"");*/
Console.WriteLine($"Cannot load type \"{s.Type}\"", Color.Red);
return null;
}
else
{
IModule module = (IModule)Activator.CreateInstance(type);
return module;
}
}
);
}
///
/// Configurates the services.
///
///
/// Instance of .
///
///
/// Instance of .
///
public void ConfigureServices(IServiceCollection services)
{
foreach (IModule module in this._modules)
{
if (module == null) continue;
module.ConfigureServices(services, this._configuration);
}
}
///
/// Configures module services.
///
///
/// Instance of .
///
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
foreach (IModule module in this._modules)
{
module.Configure(app, env);
}
}
}
}