Skip to content

Commit 5d22380

Browse files
author
Jacques Kang
committed
add possibility to register ipc service using custom implementation factory
1 parent 085e2b9 commit 5d22380

File tree

6 files changed

+55
-25
lines changed

6 files changed

+55
-25
lines changed

README.md

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,15 +65,16 @@ IpcServiceFramework is available via NuGet:
6565

6666
private static IServiceCollection ConfigureServices(IServiceCollection services)
6767
{
68-
services
69-
.AddIpc()
70-
.AddNamedPipe(options =>
68+
return services
69+
.AddIpc(builder =>
7170
{
72-
options.ThreadCount = 2;
71+
builder
72+
.AddNamedPipe(options =>
73+
{
74+
options.ThreadCount = 2;
75+
})
76+
.AddService<IComputingService, ComputingService>();
7377
});
74-
75-
return services
76-
.AddService<IComputingService, ComputingService>();
7778
}
7879
}
7980
```

src/IpcServiceSample.ConsoleServer/Program.cs

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,23 +33,22 @@ static void Main(string[] args)
3333

3434
private static IServiceCollection ConfigureServices(IServiceCollection services)
3535
{
36-
services
36+
return services
3737
.AddLogging(builder =>
3838
{
3939
builder.AddConsole();
4040
builder.SetMinimumLevel(LogLevel.Debug);
41-
});
42-
43-
services
44-
.AddIpc()
45-
.AddNamedPipe(options =>
46-
{
47-
options.ThreadCount = 2;
4841
})
49-
.AddService<IComputingService, ComputingService>()
50-
.AddService<ISystemService, SystemService>();
51-
52-
return services;
42+
.AddIpc(builder =>
43+
{
44+
builder
45+
.AddNamedPipe(options =>
46+
{
47+
options.ThreadCount = 2;
48+
})
49+
.AddService<IComputingService, ComputingService>()
50+
.AddService<ISystemService, SystemService>();
51+
});
5352
}
5453
}
5554
}

src/IpcServiceSample.WebServer/Startup.cs

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,13 @@ public class Startup
1313
public void ConfigureServices(IServiceCollection services)
1414
{
1515
services
16-
.AddIpc()
17-
.AddNamedPipe()
18-
.AddService<IComputingService, ComputingService>()
19-
.AddService<ISystemService, SystemService>();
16+
.AddIpc(builder =>
17+
{
18+
builder
19+
.AddNamedPipe()
20+
.AddService<IComputingService, ComputingService>()
21+
.AddService<ISystemService, SystemService>();
22+
});
2023
}
2124

2225
public void Configure(IApplicationBuilder app, IHostingEnvironment env)

src/JKang.IpcServiceFramework.Server/IIpcServiceBuilder.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Microsoft.Extensions.DependencyInjection;
2+
using System;
23

34
namespace JKang.IpcServiceFramework
45
{
@@ -9,5 +10,9 @@ public interface IIpcServiceBuilder
910
IIpcServiceBuilder AddService<TInterface, TImplementation>()
1011
where TInterface: class
1112
where TImplementation: class, TInterface;
13+
14+
IIpcServiceBuilder AddService<TInterface, TImplementation>(Func<IServiceProvider, TImplementation> implementationFactory)
15+
where TInterface : class
16+
where TImplementation : class, TInterface;
1217
}
1318
}

src/JKang.IpcServiceFramework.Server/IpcServiceBuilder.cs

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Microsoft.Extensions.DependencyInjection;
2+
using System;
23

34
namespace JKang.IpcServiceFramework
45
{
@@ -11,10 +12,20 @@ public IpcServiceBuilder(IServiceCollection services)
1112

1213
public IServiceCollection Services { get; }
1314

14-
IIpcServiceBuilder IIpcServiceBuilder.AddService<TInterface, TImplementation>()
15+
public IIpcServiceBuilder AddService<TInterface, TImplementation>()
16+
where TInterface : class
17+
where TImplementation : class, TInterface
1518
{
1619
Services.AddScoped<TInterface, TImplementation>();
1720
return this;
1821
}
22+
23+
public IIpcServiceBuilder AddService<TInterface, TImplementation>(Func<IServiceProvider, TImplementation> implementationFactory)
24+
where TInterface : class
25+
where TImplementation : class, TInterface
26+
{
27+
Services.AddScoped<TInterface, TImplementation>(implementationFactory);
28+
return this;
29+
}
1930
}
2031
}
Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,29 @@
11
using JKang.IpcServiceFramework.Services;
22
using Microsoft.Extensions.DependencyInjection;
3+
using System;
34

45
namespace JKang.IpcServiceFramework
56
{
67
public static class IpcServiceServiceCollectionExtensions
78
{
9+
[Obsolete("Use services.AddIpc(builder => { ... }) instead.")]
810
public static IIpcServiceBuilder AddIpc(this IServiceCollection services)
11+
{
12+
IIpcServiceBuilder builder = null;
13+
services.AddIpc(x => builder = x);
14+
return builder;
15+
}
16+
17+
public static IServiceCollection AddIpc(this IServiceCollection services, Action<IIpcServiceBuilder> configAction)
918
{
1019
services
1120
.AddLogging()
1221
.AddScoped<IValueConverter, DefaultValueConverter>()
1322
.AddScoped<IIpcMessageSerializer, DefaultIpcMessageSerializer>();
1423

15-
return new IpcServiceBuilder(services);
24+
var builder = new IpcServiceBuilder(services);
25+
configAction?.Invoke(builder);
26+
return services;
1627
}
1728
}
1829
}

0 commit comments

Comments
 (0)