using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Hosting; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Caching.Memory; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using Microsoft.Extensions.Logging; using Microsoft.OpenApi.Models; using Ropin.Inspection.Model.Entities; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Threading.Tasks; using Ropin.Core.Extensions.ServiceExtensions; using Ropin.Inspection.Common.Helper; using log4net.Config; using log4net; using System.Reflection; namespace Ropin.IOT.MqttService { public class Startup { public Startup(IConfiguration configuration) { //Configuration = configuration; var configBuilder = new ConfigurationBuilder() .SetBasePath(Directory.GetCurrentDirectory()) .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true); Configuration = configBuilder.Build(); var logRepo = LogManager.GetRepository(Assembly.GetEntryAssembly()); XmlConfigurator.Configure(logRepo, new FileInfo("log4net.config")); } public IConfiguration Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { services.AddSingleton(new Appsettings(Configuration)); services.AddHttpClient(); services.AddControllersWithViews(); var mqttOptions = Configuration.GetSection(MqttOptions.Position).Get<MqttOptions>(); services.AddSingleton<MqttOptions>(mqttOptions); services.AddMemoryCache(); ////services.AddControllers(); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Ropin.IOT.MqttService", Version = "v1" }); }); services.AddRedisCacheSetup(); services.AddHostedService<MqttWorkService>(); services.AddNodeServices(); services.AddSignalR(); //services.AddSingleton<IConfiguration>(Configuration); var connectionString = Configuration["ConnectionSetting:MySqlConnection"]; ServerVersion serverVersion = ServerVersion.AutoDetect(connectionString); services.AddDbContext<InspectionDbContext>(options => options.UseMySql(connectionString, serverVersion)); //���ܶೡ����Scoped�ֲ����������ǣ���ʱ�����Ҫע��һ��Singleton��DBContext�Ĺ������� services.AddSingleton<Func<InspectionDbContext>>(() => { var optionsBuilder = new DbContextOptionsBuilder<InspectionDbContext>(); optionsBuilder.UseMySql(connectionString, serverVersion); //��������������Ļ�������ͨ��provider.GetService<XX>()����ȡ return new InspectionDbContext(optionsBuilder.Options); }); services.AddControllers(); //services.AddMqttClient(mqttOptions); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { MqttClientService._memoryCache = app.ApplicationServices.GetService<IMemoryCache>(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseSwagger(); app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Ropin.IOT.MqttService v1")); } app.UseRouting(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllers(); }); } } }