Skip to content

Commit 81db5cc

Browse files
committed
refactoring
1 parent aabe4f1 commit 81db5cc

File tree

11 files changed

+151
-38
lines changed

11 files changed

+151
-38
lines changed

src/JKang.IpcServiceFramework/IIpcServiceCollection.cs renamed to src/JKang.IpcServiceFramework/Hosting/IIpcServiceCollection.cs

File renamed without changes.
File renamed without changes.

src/JKang.IpcServiceFramework/IpcServiceCollection.cs renamed to src/JKang.IpcServiceFramework/Hosting/IpcServiceCollection.cs

File renamed without changes.

src/JKang.IpcServiceFramework/IpcServiceHost.cs renamed to src/JKang.IpcServiceFramework/Hosting/IpcServiceHost.cs

Lines changed: 20 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,11 @@
1-
using Microsoft.Extensions.DependencyInjection;
1+
using JKang.IpcServiceFramework.IO;
2+
using Microsoft.Extensions.DependencyInjection;
23
using Microsoft.Extensions.Logging;
3-
using Newtonsoft.Json;
44
using Newtonsoft.Json.Linq;
55
using System;
66
using System.IO;
77
using System.IO.Pipes;
88
using System.Reflection;
9-
using System.Runtime.CompilerServices;
10-
using System.Text;
11-
using System.Threading.Tasks;
129

1310
namespace JKang.IpcServiceFramework
1411
{
@@ -17,52 +14,49 @@ public class IpcServiceHost : IIpcServiceHost
1714
private readonly string _pipeName;
1815
private readonly IServiceProvider _serviceProvider;
1916
private readonly ILogger<IpcServiceHost> _logger;
17+
private readonly IIpcMessageSerializer _serializer;
2018

2119
public IpcServiceHost(string pipeName, IServiceProvider serviceProvider)
2220
{
2321
_pipeName = pipeName;
2422
_serviceProvider = serviceProvider;
2523
_logger = _serviceProvider.GetService<ILogger<IpcServiceHost>>();
24+
_serializer = _serviceProvider.GetRequiredService<IIpcMessageSerializer>();
2625
}
2726

2827
public void Start()
2928
{
3029
using (var server = new NamedPipeServerStream(_pipeName, PipeDirection.InOut, 1))
31-
using (var reader = new BinaryReader(server))
32-
using (var writer = new BinaryWriter(server))
30+
using (var writer = new IpcWriter(server, _serializer))
31+
using (var reader = new IpcReader(server, _serializer))
3332
{
33+
_logger?.LogInformation("IPC server started.");
3434
while (true)
3535
{
36-
_logger.LogInformation("IPC service started. Waiting for connection");
36+
_logger?.LogDebug("Waiting for connection...");
3737
server.WaitForConnection();
3838

39-
_logger.LogDebug("client connected");
4039
try
4140
{
41+
_logger?.LogDebug("client connected, reading request...");
42+
IpcRequest request = reader.ReadIpcRequest();
43+
44+
_logger?.LogDebug("request received, invoking corresponding method...");
45+
IpcResponse response;
4246
using (IServiceScope scope = _serviceProvider.CreateScope())
4347
{
44-
IIpcMessageSerializer serializer = scope.ServiceProvider.GetRequiredService<IIpcMessageSerializer>();
45-
46-
int requestLength = reader.ReadInt32();
47-
byte[] requestBin = reader.ReadBytes(requestLength);
48-
IpcRequest request = serializer.DeserializeRequest(requestBin);
49-
50-
_logger.LogDebug("request received, invoking corresponding method...");
51-
IpcResponse response = GetReponse(request, scope);
48+
response = GetReponse(request, scope);
49+
}
5250

53-
_logger.LogDebug("sending response...");
54-
byte[] responseBin = serializer.SerializeResponse(response);
55-
writer.Write(responseBin.Length);
56-
writer.Write(responseBin);
57-
writer.Flush();
51+
_logger?.LogDebug("sending response...");
52+
writer.Write(response);
5853

59-
// disconnect client
60-
server.Disconnect();
61-
}
54+
// disconnect client
55+
server.Disconnect();
6256
}
6357
catch (Exception ex)
6458
{
65-
_logger.LogError(ex, ex.Message);
59+
_logger?.LogError(ex, ex.Message);
6660
server.Disconnect();
6761
}
6862
}

src/JKang.IpcServiceFramework/IpcServiceHostBuilder.cs renamed to src/JKang.IpcServiceFramework/Hosting/IpcServiceHostBuilder.cs

File renamed without changes.

src/JKang.IpcServiceFramework/IpcServiceServiceCollectionExtensions.cs renamed to src/JKang.IpcServiceFramework/Hosting/IpcServiceServiceCollectionExtensions.cs

File renamed without changes.
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using System;
2+
using System.IO;
3+
4+
namespace JKang.IpcServiceFramework.IO
5+
{
6+
public class IpcReader : IDisposable
7+
{
8+
private readonly BinaryReader _reader;
9+
private readonly IIpcMessageSerializer _serializer;
10+
11+
public IpcReader(Stream stream, IIpcMessageSerializer serializer)
12+
{
13+
_reader = new BinaryReader(stream);
14+
_serializer = serializer;
15+
}
16+
17+
public IpcRequest ReadIpcRequest()
18+
{
19+
byte[] binary = ReadMessage();
20+
return _serializer.DeserializeRequest(binary);
21+
}
22+
23+
public IpcResponse ReadIpcResponse()
24+
{
25+
byte[] binary = ReadMessage();
26+
return _serializer.DeserializeResponse(binary);
27+
}
28+
29+
private byte[] ReadMessage()
30+
{
31+
int length = _reader.ReadInt32();
32+
return _reader.ReadBytes(length);
33+
}
34+
35+
#region IDisposible
36+
37+
bool _disposed = false;
38+
39+
public void Dispose()
40+
{
41+
Dispose(true);
42+
GC.SuppressFinalize(this);
43+
}
44+
45+
protected virtual void Dispose(bool disposing)
46+
{
47+
if (_disposed)
48+
{
49+
return;
50+
}
51+
52+
if (disposing)
53+
{
54+
_reader.Dispose();
55+
}
56+
57+
_disposed = true;
58+
}
59+
60+
#endregion
61+
}
62+
}
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
using System;
2+
using System.IO;
3+
4+
namespace JKang.IpcServiceFramework.IO
5+
{
6+
public class IpcWriter: IDisposable
7+
{
8+
private readonly BinaryWriter _writer;
9+
private readonly IIpcMessageSerializer _serializer;
10+
11+
public IpcWriter(Stream stream, IIpcMessageSerializer serializer)
12+
{
13+
_writer = new BinaryWriter(stream);
14+
_serializer = serializer;
15+
}
16+
17+
public void Write(IpcRequest request)
18+
{
19+
byte[] binary = _serializer.SerializeRequest(request);
20+
WriteMessage(binary);
21+
}
22+
23+
public void Write(IpcResponse response)
24+
{
25+
byte[] binary = _serializer.SerializeResponse(response);
26+
WriteMessage(binary);
27+
}
28+
29+
private void WriteMessage(byte[] binary)
30+
{
31+
_writer.Write(binary.Length);
32+
_writer.Write(binary);
33+
}
34+
35+
#region IDisposible
36+
37+
bool _disposed = false;
38+
39+
public void Dispose()
40+
{
41+
Dispose(true);
42+
GC.SuppressFinalize(this);
43+
}
44+
45+
protected virtual void Dispose(bool disposing)
46+
{
47+
if (_disposed)
48+
{
49+
return;
50+
}
51+
52+
if (disposing)
53+
{
54+
_writer.Dispose();
55+
}
56+
57+
_disposed = true;
58+
}
59+
60+
#endregion
61+
}
62+
}

src/JKang.IpcServiceFramework/IpcServiceClient.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
1-
using Newtonsoft.Json.Linq;
1+
using JKang.IpcServiceFramework.IO;
2+
using Newtonsoft.Json.Linq;
23
using System;
34
using System.IO;
45
using System.IO.Pipes;
@@ -24,27 +25,21 @@ public IpcServiceClient(string pipeName, IIpcMessageSerializer requestSerializer
2425
public async Task<TResult> InvokeAsync<TResult>(string method, params object[] args)
2526
{
2627
using (var client = new NamedPipeClientStream(".", _pipeName, PipeDirection.InOut, PipeOptions.None))
28+
using (var writer = new IpcWriter(client, _serializer))
29+
using (var reader = new IpcReader(client, _serializer))
2730
{
2831
await client.ConnectAsync();
2932

3033
// send request
31-
var request = new IpcRequest
34+
writer.Write(new IpcRequest
3235
{
3336
InterfaceName = typeof(TInterface).AssemblyQualifiedName,
3437
MethodName = method,
3538
Parameters = args,
36-
};
37-
byte[] requestBin = _serializer.SerializeRequest(request);
38-
var writer = new BinaryWriter(client);
39-
writer.Write(requestBin.Length);
40-
writer.Write(requestBin);
41-
await client.FlushAsync();
39+
});
4240

4341
// receive response
44-
var reader = new BinaryReader(client);
45-
int responseLength = reader.ReadInt32();
46-
byte[] responseBin = reader.ReadBytes(responseLength);
47-
IpcResponse response = _serializer.DeserializeResponse(responseBin);
42+
IpcResponse response = reader.ReadIpcResponse();
4843
if (response.Succeed)
4944
{
5045
// TODO: handle primitive types

src/JKang.IpcServiceFramework/DefaultIpcMessageSerializer.cs renamed to src/JKang.IpcServiceFramework/Services/DefaultIpcMessageSerializer.cs

File renamed without changes.

0 commit comments

Comments
 (0)