Skip to content

Commit 940f3b3

Browse files
author
Csernák Tamás
committed
Implemented a controller name convention
A statemachine meta controller is now paired with the subjec type, and when configuring the state machine feature, we can set a controller name with which we configure the meta controller routes
1 parent 301561f commit 940f3b3

File tree

4 files changed

+72
-82
lines changed

4 files changed

+72
-82
lines changed

common/common.utils/StateMachineFeature/StateMachineController.cs

+5-9
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
namespace CST.Common.Utils.StateMachineFeature
66
{
77
[Controller]
8-
public class StateMachineController<TKey> : ControllerBase
8+
public class StateMachineController<TKey, TSubject> : ControllerBase
99
where TKey : struct, IEquatable<TKey>
1010
{
1111
private readonly IStateMachineMetaService<TKey> _stateMachineMetaService;
@@ -22,15 +22,11 @@ public IActionResult GetStates()
2222
}
2323

2424
[HttpGet("transitions")]
25-
public IActionResult GetTransitions()
25+
public IActionResult GetTransitions([FromQuery] TKey? currentStateId)
2626
{
27-
return Ok(_stateMachineMetaService.GetInitialTransitions());
28-
}
29-
30-
[HttpGet("transitions/{currentStateId}")]
31-
public IActionResult GetTransitions(TKey currentStateId)
32-
{
33-
return Ok(_stateMachineMetaService.GetTransitions(currentStateId));
27+
return Ok(currentStateId.HasValue
28+
? _stateMachineMetaService.GetTransitions(currentStateId.Value)
29+
: _stateMachineMetaService.GetInitialTransitions());
3430
}
3531
}
3632
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Text;
4+
using Microsoft.AspNetCore.Mvc;
5+
using Microsoft.AspNetCore.Mvc.ApplicationModels;
6+
7+
namespace CST.Common.Utils.StateMachineFeature
8+
{
9+
public class StateMachineControllerNameConvention<TKey, TSubject> : IControllerModelConvention
10+
where TKey : struct, IEquatable<TKey>
11+
{
12+
private readonly string _controllerName;
13+
14+
public StateMachineControllerNameConvention(string controllerName)
15+
{
16+
_controllerName = controllerName;
17+
}
18+
public void Apply(ControllerModel controller)
19+
{
20+
if (controller.ControllerType != typeof(StateMachineController<TKey, TSubject>)) return;
21+
22+
controller.Selectors.Clear();
23+
controller.Selectors.Add(new SelectorModel
24+
{
25+
AttributeRouteModel = new AttributeRouteModel(new RouteAttribute($"/api/{_controllerName}"))
26+
});
27+
}
28+
}
29+
}

common/common.utils/StateMachineFeature/StateMachineFeatureBuilder.cs

+36-71
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Runtime.InteropServices.ComTypes;
34
using CST.Common.Utils.StateMachineFeature.BaseClasses;
45
using CST.Common.Utils.StateMachineFeature.ViewModel;
56
using Microsoft.AspNetCore.Mvc.ApplicationParts;
@@ -9,154 +10,114 @@ namespace CST.Common.Utils.StateMachineFeature
910
{
1011
public class StateMachineFeatureBuilder
1112
{
12-
private readonly IList<IApplicationFeatureProvider> _featureProviders;
13-
private readonly IServiceCollection _services;
13+
protected readonly IMvcCoreBuilder MvcCoreBuilder;
14+
protected readonly IServiceCollection Services;
1415

1516
public StateMachineFeatureBuilder(IServiceCollection services)
1617
{
17-
_featureProviders = services.AddMvcCore().PartManager.FeatureProviders;
18-
_services = services;
18+
MvcCoreBuilder = services.AddMvcCore();
19+
Services = services;
1920
}
2021

2122
public StateMachineFeatureBuilder<T> WithKeyType<T>()
2223
where T : struct, IEquatable<T>
2324
{
24-
return new StateMachineFeatureBuilder<T>(_featureProviders, _services);
25+
return new StateMachineFeatureBuilder<T>(Services);
2526
}
2627
}
2728

28-
public class StateMachineFeatureBuilder<T1>
29+
public class StateMachineFeatureBuilder<T1> : StateMachineFeatureBuilder
2930
where T1 : struct, IEquatable<T1>
3031
{
31-
private readonly IList<IApplicationFeatureProvider> _featureProviders;
32-
private readonly IServiceCollection _services;
33-
34-
public StateMachineFeatureBuilder(
35-
IList<IApplicationFeatureProvider> featureProviders,
36-
IServiceCollection services)
32+
public StateMachineFeatureBuilder(IServiceCollection services) : base(services)
3733
{
38-
_featureProviders = featureProviders;
39-
_services = services;
4034
}
4135

4236
public StateMachineFeatureBuilder<T1, T> WithGraphEnumType<T>()
4337
where T : struct, IConvertible
4438
{
45-
return new StateMachineFeatureBuilder<T1, T>(_featureProviders, _services);
39+
return new StateMachineFeatureBuilder<T1, T>(Services);
4640
}
4741
}
4842

49-
public class StateMachineFeatureBuilder<T1, T2>
43+
public class StateMachineFeatureBuilder<T1, T2> : StateMachineFeatureBuilder<T1>
5044
where T1 : struct, IEquatable<T1>
5145
where T2 : struct, IConvertible
5246
{
53-
private readonly IList<IApplicationFeatureProvider> _featureProviders;
54-
private readonly IServiceCollection _services;
55-
56-
public StateMachineFeatureBuilder(
57-
IList<IApplicationFeatureProvider> featureProviders,
58-
IServiceCollection services)
47+
public StateMachineFeatureBuilder(IServiceCollection services) : base(services)
5948
{
60-
_featureProviders = featureProviders;
61-
_services = services;
6249
}
6350

6451
public StateMachineFeatureBuilder<T1, T2, T> WithVertexEnumType<T>()
6552
where T : struct, IConvertible
6653
{
67-
return new StateMachineFeatureBuilder<T1, T2, T>(_featureProviders, _services);
54+
return new StateMachineFeatureBuilder<T1, T2, T>(Services);
6855
}
6956
}
7057

71-
public class StateMachineFeatureBuilder<T1, T2, T3>
58+
public class StateMachineFeatureBuilder<T1, T2, T3> : StateMachineFeatureBuilder<T1, T2>
7259
where T1 : struct, IEquatable<T1>
7360
where T2 : struct, IConvertible
7461
where T3 : struct, IConvertible
7562
{
76-
private readonly IList<IApplicationFeatureProvider> _featureProviders;
77-
private readonly IServiceCollection _services;
78-
79-
public StateMachineFeatureBuilder(
80-
IList<IApplicationFeatureProvider> featureProviders,
81-
IServiceCollection services)
63+
public StateMachineFeatureBuilder(IServiceCollection services) : base(services)
8264
{
83-
_featureProviders = featureProviders;
84-
_services = services;
8565
}
8666

87-
public StateMachineFeatureBuilder<T1, T2, T3, T> WithSubjectType<T>()
67+
public StateMachineFeatureBuilder<T1, T2, T3, T> WithSubjectType<T>(string controllerName)
8868
where T : StateMachineSubject<T1, T2, T3, T>, new()
8969
{
90-
return new StateMachineFeatureBuilder<T1, T2, T3, T>(_featureProviders, _services);
70+
return new StateMachineFeatureBuilder<T1, T2, T3, T>(Services, controllerName);
9171
}
9272
}
9373

94-
public class StateMachineFeatureBuilder<T1, T2, T3, T4>
74+
public class StateMachineFeatureBuilder<T1, T2, T3, T4> : StateMachineFeatureBuilder<T1, T2, T3>
9575
where T1 : struct, IEquatable<T1>
9676
where T2 : struct, IConvertible
9777
where T3 : struct, IConvertible
9878
where T4 : StateMachineSubject<T1, T2, T3, T4>, new()
9979
{
100-
private readonly IList<IApplicationFeatureProvider> _featureProviders;
101-
private readonly IServiceCollection _services;
102-
103-
public StateMachineFeatureBuilder(
104-
IList<IApplicationFeatureProvider> featureProviders,
105-
IServiceCollection services)
80+
protected readonly string SubjectControllerName;
81+
public StateMachineFeatureBuilder(IServiceCollection services, string subjectControllerName) : base(services)
10682
{
107-
_featureProviders = featureProviders;
108-
_services = services;
83+
SubjectControllerName = subjectControllerName;
10984
}
11085

11186
public StateMachineFeatureBuilder<T1, T2, T3, T4, T> WithRepositoryType<T>()
11287
where T : BaseStateMachineRepository<T1, T2, T3, T4>
11388
{
114-
return new StateMachineFeatureBuilder<T1, T2, T3, T4, T>(_featureProviders, _services);
89+
return new StateMachineFeatureBuilder<T1, T2, T3, T4, T>(Services, SubjectControllerName);
11590
}
11691
}
11792

118-
public class StateMachineFeatureBuilder<T1, T2, T3, T4, T5>
93+
public class StateMachineFeatureBuilder<T1, T2, T3, T4, T5> : StateMachineFeatureBuilder<T1, T2, T3, T4>
11994
where T1 : struct, IEquatable<T1>
12095
where T2 : struct, IConvertible
12196
where T3 : struct, IConvertible
12297
where T4 : StateMachineSubject<T1, T2, T3, T4>, new()
12398
where T5 : BaseStateMachineRepository<T1, T2, T3, T4>
12499
{
125-
private readonly IList<IApplicationFeatureProvider> _featureProviders;
126-
private readonly IServiceCollection _services;
127-
128-
public StateMachineFeatureBuilder(
129-
IList<IApplicationFeatureProvider> featureProviders,
130-
IServiceCollection services)
100+
public StateMachineFeatureBuilder(IServiceCollection services, string subjectControllerName) : base(services, subjectControllerName)
131101
{
132-
_featureProviders = featureProviders;
133-
_services = services;
134102
}
135103

136104
public StateMachineFeatureBuilder<T1, T2, T3, T4, T5, T> WithStateMachineService<T>()
137105
where T : BaseStateMachineService<T1, T2, T3, T4, T5>
138106
{
139-
return new StateMachineFeatureBuilder<T1, T2, T3, T4, T5, T>(_featureProviders, _services);
107+
return new StateMachineFeatureBuilder<T1, T2, T3, T4, T5, T>(Services, SubjectControllerName);
140108
}
141109
}
142110

143-
public class StateMachineFeatureBuilder<T1, T2, T3, T4, T5, T6>
111+
public class StateMachineFeatureBuilder<T1, T2, T3, T4, T5, T6> : StateMachineFeatureBuilder<T1, T2, T3, T4, T5>
144112
where T1 : struct, IEquatable<T1>
145113
where T2 : struct, IConvertible
146114
where T3 : struct, IConvertible
147115
where T4 : StateMachineSubject<T1, T2, T3, T4>, new()
148116
where T5 : BaseStateMachineRepository<T1, T2, T3, T4>
149117
where T6 : BaseStateMachineService<T1, T2, T3, T4, T5>
150118
{
151-
private readonly IList<IApplicationFeatureProvider> _featureProviders;
152-
private readonly IServiceCollection _services;
153-
154-
public StateMachineFeatureBuilder(
155-
IList<IApplicationFeatureProvider> featureProviders,
156-
IServiceCollection services)
119+
public StateMachineFeatureBuilder(IServiceCollection services, string subjectControllerName) : base(services, subjectControllerName)
157120
{
158-
_featureProviders = featureProviders;
159-
_services = services;
160121
}
161122

162123
public void Build()
@@ -169,24 +130,28 @@ public void Build()
169130

170131
private void AddFeatureProvider()
171132
{
172-
_featureProviders.Add(new StateMachineFeatureProvider<T1>());
133+
MvcCoreBuilder.PartManager.FeatureProviders.Add(new StateMachineFeatureProvider<T1, T4>());
173134
}
174135

175136
private void AddStateMachineRepository()
176137
{
177-
_services.AddScoped<T5>();
178-
_services.AddScoped<BaseStateMachineRepository<T1, T2, T3, T4>>((svc) => svc.GetService<T5>());
138+
Services.AddScoped<T5>();
139+
Services.AddScoped<BaseStateMachineRepository<T1, T2, T3, T4>>((svc) => svc.GetService<T5>());
179140
}
180141

181142
private void AddStateMachineMetaService()
182143
{
183-
_services.AddScoped<IStateMachineMetaService<T1>, StateMachineMetaService<T1, T2, T3, T5, T4>>();
144+
Services.AddScoped<IStateMachineMetaService<T1>, StateMachineMetaService<T1, T2, T3, T5, T4>>();
145+
MvcCoreBuilder.AddMvcOptions(o =>
146+
{
147+
o.Conventions.Add(new StateMachineControllerNameConvention<T1, T4>(SubjectControllerName));
148+
});
184149
}
185150

186151
private void AddStateMachineService()
187152
{
188-
_services.AddScoped<T6>();
189-
_services.AddScoped<BaseStateMachineService<T1, T2, T3, T4, T5>>(
153+
Services.AddScoped<T6>();
154+
Services.AddScoped<BaseStateMachineService<T1, T2, T3, T4, T5>>(
190155
serviceProvider => serviceProvider.GetRequiredService<T6>());
191156
}
192157
}

common/common.utils/StateMachineFeature/StateMachineFeatureProvider.cs

+2-2
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,12 @@
66

77
namespace CST.Common.Utils.StateMachineFeature
88
{
9-
internal class StateMachineFeatureProvider<TKey> : IApplicationFeatureProvider<ControllerFeature>
9+
internal class StateMachineFeatureProvider<TKey, TSubject> : IApplicationFeatureProvider<ControllerFeature>
1010
where TKey : struct, IEquatable<TKey>
1111
{
1212
public void PopulateFeature(IEnumerable<ApplicationPart> parts, ControllerFeature feature)
1313
{
14-
feature.Controllers.Add(typeof(StateMachineController<TKey>).GetTypeInfo());
14+
feature.Controllers.Add(typeof(StateMachineController<TKey, TSubject>).GetTypeInfo());
1515
}
1616
}
1717
}

0 commit comments

Comments
 (0)