This repository was archived by the owner on Jan 25, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathStartup.cs
executable file
·84 lines (71 loc) · 3.28 KB
/
Startup.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using NLog.Config;
using NLog.Targets;
using PostsService.Kafka.Consumers;
using PostsService.Data;
using PostsService.Kafka;
using PostsService.Service;
namespace PostsService
{
public class Startup
{
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
ConfigureKafka(services);
ConfigureLogging(services);
// dependency injection of data context and post service
services.AddDbContext<DataContext>();
services.AddScoped<BasicPostsService>();
services.AddScoped<IPostsService>(x => x.GetRequiredService<BasicPostsService>());
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory)
{
if (env.IsDevelopment()) app.UseDeveloperExceptionPage();
using (var serviceScope = app.ApplicationServices.GetService<IServiceScopeFactory>().CreateScope())
{
var services = serviceScope.ServiceProvider;
var context = services.GetRequiredService<DataContext>();
context.Database.EnsureDeleted(); // for testing purposes
context.Database.EnsureCreated();
}
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
private void ConfigureKafka(IServiceCollection services)
{
// create producers
services.AddSingleton<KafkaClientHandle>();
services.AddSingleton<KafkaProducer<long, string>>(); // communication with services: ("post_id", "text")
services.AddSingleton<KafkaProducer<string, string>>(); // logs: ("service_name", "log")
// create consumers of messages from text processing systems
services.AddHostedService<LanguageDetectionConsumer>();
services.AddHostedService<OffensiveTextDetectionConsumer>();
services.AddHostedService<TopicsConsumer>();
}
private void ConfigureLogging(IServiceCollection services)
{
Target.Register<KafkaLoggerTarget>("KafkaLogger");
// workaround to use dependency injection + NLog custom target
// see https://stackoverflow.com/questions/42033398/custom-nlog-layoutrenderer-with-constructor-using-dependency-injection/42101946#42101946
// for more information
ConfigurationItemFactory.Default.CreateInstance = (Type type) =>
{
if (type == typeof(KafkaLoggerTarget))
return new KafkaLoggerTarget(services.BuildServiceProvider().GetService<KafkaClientHandle>());
else return Activator.CreateInstance(type);
};
}
}
}