Skip to content

Commit 4ba26db

Browse files
committed
Adding method for registering stream behaviors
1 parent 513c202 commit 4ba26db

3 files changed

Lines changed: 68 additions & 0 deletions

File tree

src/MediatR/MicrosoftExtensionsDI/MediatrServiceConfiguration.cs

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ public class MediatRServiceConfiguration
4747
/// </summary>
4848
public List<ServiceDescriptor> BehaviorsToRegister { get; } = new();
4949

50+
/// <summary>
51+
/// List of stream behaviors to register in specific order
52+
/// </summary>
53+
public List<ServiceDescriptor> StreamBehaviorsToRegister { get; } = new();
54+
5055
/// <summary>
5156
/// Register various handlers from assembly containing given type
5257
/// </summary>
@@ -140,4 +145,28 @@ public MediatRServiceConfiguration AddOpenBehavior(Type openBehaviorType, Servic
140145

141146
return this;
142147
}
148+
149+
/// <summary>
150+
/// Register a closed stream behavior type
151+
/// </summary>
152+
/// <typeparam name="TServiceType">Closed stream behavior interface type</typeparam>
153+
/// <typeparam name="TImplementationType">Closed stream behavior implementation type</typeparam>
154+
/// <param name="serviceLifetime">Optional service lifetime, defaults to <see cref="ServiceLifetime.Transient"/>.</param>
155+
/// <returns>This</returns>
156+
public MediatRServiceConfiguration AddStreamBehavior<TServiceType, TImplementationType>(ServiceLifetime serviceLifetime = ServiceLifetime.Transient)
157+
=> AddStreamBehavior(typeof(TServiceType), typeof(TImplementationType), serviceLifetime);
158+
159+
/// <summary>
160+
/// Register a closed stream behavior type
161+
/// </summary>
162+
/// <param name="serviceType">Closed stream behavior interface type</param>
163+
/// <param name="implementationType">Closed stream behavior implementation type</param>
164+
/// <param name="serviceLifetime">Optional service lifetime, defaults to <see cref="ServiceLifetime.Transient"/>.</param>
165+
/// <returns>This</returns>
166+
public MediatRServiceConfiguration AddStreamBehavior(Type serviceType, Type implementationType, ServiceLifetime serviceLifetime = ServiceLifetime.Transient)
167+
{
168+
StreamBehaviorsToRegister.Add(new ServiceDescriptor(serviceType, implementationType, serviceLifetime));
169+
170+
return this;
171+
}
143172
}

src/MediatR/Registration/ServiceRegistrar.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,11 @@ public static void AddRequiredServices(IServiceCollection services, MediatRServi
225225
services.TryAdd(notificationPublisherServiceDescriptor);
226226

227227
foreach (var serviceDescriptor in serviceConfiguration.BehaviorsToRegister)
228+
{
229+
services.TryAddEnumerable(serviceDescriptor);
230+
}
231+
232+
foreach (var serviceDescriptor in serviceConfiguration.StreamBehaviorsToRegister)
228233
{
229234
services.TryAddEnumerable(serviceDescriptor);
230235
}

test/MediatR.Tests/MicrosoftExtensionsDI/StreamPipelineTests.cs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,38 @@ public async Task Should_wrap_with_behavior()
8484
"Outer after"
8585
});
8686
}
87+
88+
[Fact]
89+
public async Task Should_register_and_wrap_with_behavior()
90+
{
91+
var output = new Logger();
92+
IServiceCollection services = new ServiceCollection();
93+
services.AddSingleton(output);
94+
services.AddMediatR(cfg =>
95+
{
96+
cfg.RegisterServicesFromAssembly(typeof(Ping).Assembly);
97+
cfg.AddStreamBehavior<IStreamPipelineBehavior<StreamPing, Pong>, OuterBehavior>();
98+
cfg.AddStreamBehavior<IStreamPipelineBehavior<StreamPing, Pong>, InnerBehavior>();
99+
});
100+
var provider = services.BuildServiceProvider();
101+
102+
var mediator = provider.GetRequiredService<IMediator>();
103+
104+
var stream = mediator.CreateStream(new StreamPing { Message = "Ping" });
105+
106+
await foreach (var response in stream)
107+
{
108+
response.Message.ShouldBe("Ping Pang");
109+
}
110+
111+
output.Messages.ShouldBe(new[]
112+
{
113+
"Outer before",
114+
"Inner before",
115+
"Handler",
116+
"Inner after",
117+
"Outer after"
118+
});
119+
}
120+
87121
}

0 commit comments

Comments
 (0)