-
Notifications
You must be signed in to change notification settings - Fork 0
/
Program.cs
62 lines (46 loc) · 2.16 KB
/
Program.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
using Microsoft.Extensions.DependencyInjection;
using Pulse;
using System.Net;
using System.Net.Sockets;
using System.Reflection;
using System.Text;
var services = new ServiceCollection()
.AddScoped<TcpClientAccessor>()
.AddScoped<TcpClient>(x => x.GetRequiredService<TcpClientAccessor>().Client)
.AddScoped<StreamReaderAccessor>()
.AddScoped<StreamReader>(x => x.GetRequiredService<StreamReaderAccessor>().Reader)
.AddScoped<StreamWriterAccessor>()
.AddScoped<StreamWriter>(x => x.GetRequiredService<StreamWriterAccessor>().Writer)
.AddScoped<ContextAccessor>()
.AddScoped<Context>(x => x.GetRequiredService<ContextAccessor>().Context)
.AddScoped<InboundClient>();
var commandNamespace = typeof(Pulse.Commands.Command).Namespace;
var commandTypes = Assembly.GetExecutingAssembly().GetTypes()
.Where(t => t.Namespace == commandNamespace && t.IsClass && !t.IsAbstract);
foreach (var commandType in commandTypes)
services.AddScoped(commandType);
var serviceProvider = services.BuildServiceProvider();
var listener = new TcpListener(IPAddress.Any, Settings.Port);
listener.Start();
while (true)
{
var client = listener.AcceptTcpClient();
var thread = new Thread(async () =>
{
using var stream = client.GetStream();
using var reader = new StreamReader(stream, Encoding.ASCII);
using var writer = new StreamWriter(stream, Encoding.ASCII) { AutoFlush = true };
using var scope = serviceProvider.CreateScope();
var clientAccessor = scope.ServiceProvider.GetRequiredService<TcpClientAccessor>();
clientAccessor.Client = client;
var readerAccessor = scope.ServiceProvider.GetRequiredService<StreamReaderAccessor>();
readerAccessor.Reader = reader;
var writerAccessor = scope.ServiceProvider.GetRequiredService<StreamWriterAccessor>();
writerAccessor.Writer = writer;
var contextAccessor = scope.ServiceProvider.GetRequiredService<ContextAccessor>();
contextAccessor.Context = new Context();
var inboundClient = scope.ServiceProvider.GetRequiredService<InboundClient>();
await inboundClient.Run();
});
thread.Start();
}