Skip to content

Commit

Permalink
File-scoped namespaces
Browse files Browse the repository at this point in the history
  • Loading branch information
jbogard committed Jan 5, 2022
1 parent efd7fe7 commit c4f1a91
Show file tree
Hide file tree
Showing 91 changed files with 4,272 additions and 4,366 deletions.
2 changes: 1 addition & 1 deletion Directory.Build.props
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<Project>
<PropertyGroup>
<LangVersion>preview</LangVersion>
<LangVersion>10.0</LangVersion>
<NoWarn>$(NoWarn);CS1701;CS1702;CS1591</NoWarn>
<TreatWarningsAsErrors>true</TreatWarningsAsErrors>
</PropertyGroup>
Expand Down
43 changes: 21 additions & 22 deletions samples/MediatR.Examples.AspNetCore/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,35 +5,34 @@
using Microsoft.Extensions.DependencyInjection;


namespace MediatR.Examples.AspNetCore
namespace MediatR.Examples.AspNetCore;

public static class Program
{
public static class Program
public static Task Main(string[] args)
{
public static Task Main(string[] args)
{
var writer = new WrappingWriter(Console.Out);
var mediator = BuildMediator(writer);
return Runner.Run(mediator, writer, "ASP.NET Core DI", testStreams: true);
}
var writer = new WrappingWriter(Console.Out);
var mediator = BuildMediator(writer);
return Runner.Run(mediator, writer, "ASP.NET Core DI", testStreams: true);
}

private static IMediator BuildMediator(WrappingWriter writer)
{
var services = new ServiceCollection();
private static IMediator BuildMediator(WrappingWriter writer)
{
var services = new ServiceCollection();

services.AddSingleton<TextWriter>(writer);
services.AddSingleton<TextWriter>(writer);

services.AddMediatR(typeof(Ping), typeof(Sing));
services.AddMediatR(typeof(Ping), typeof(Sing));

services.AddScoped(typeof(IStreamRequestHandler<Sing, Song>), typeof(SingHandler));
services.AddScoped(typeof(IStreamRequestHandler<Sing, Song>), typeof(SingHandler));

services.AddScoped(typeof(IPipelineBehavior<,>), typeof(GenericPipelineBehavior<,>));
services.AddScoped(typeof(IRequestPreProcessor<>), typeof(GenericRequestPreProcessor<>));
services.AddScoped(typeof(IRequestPostProcessor<,>), typeof(GenericRequestPostProcessor<,>));
services.AddScoped(typeof(IStreamPipelineBehavior<,>), typeof(GenericStreamPipelineBehavior<,>));
services.AddScoped(typeof(IPipelineBehavior<,>), typeof(GenericPipelineBehavior<,>));
services.AddScoped(typeof(IRequestPreProcessor<>), typeof(GenericRequestPreProcessor<>));
services.AddScoped(typeof(IRequestPostProcessor<,>), typeof(GenericRequestPostProcessor<,>));
services.AddScoped(typeof(IStreamPipelineBehavior<,>), typeof(GenericStreamPipelineBehavior<,>));

var provider = services.BuildServiceProvider();
var provider = services.BuildServiceProvider();

return provider.GetRequiredService<IMediator>();
}
return provider.GetRequiredService<IMediator>();
}
}
}
139 changes: 69 additions & 70 deletions samples/MediatR.Examples.Autofac/Program.cs
Original file line number Diff line number Diff line change
@@ -1,87 +1,86 @@
namespace MediatR.Examples.Autofac
{
using global::Autofac;
using MediatR.Pipeline;
using System;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;
namespace MediatR.Examples.Autofac;

using global::Autofac;
using MediatR.Pipeline;
using System;
using System.IO;
using System.Reflection;
using System.Threading.Tasks;

internal static class Program
internal static class Program
{
public static Task Main(string[] args)
{
public static Task Main(string[] args)
{
var writer = new WrappingWriter(Console.Out);
var mediator = BuildMediator(writer);
var writer = new WrappingWriter(Console.Out);
var mediator = BuildMediator(writer);

return Runner.Run(mediator, writer, "Autofac", testStreams: true);
}
return Runner.Run(mediator, writer, "Autofac", testStreams: true);
}

private static IMediator BuildMediator(WrappingWriter writer)
{
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly).AsImplementedInterfaces();
private static IMediator BuildMediator(WrappingWriter writer)
{
var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly).AsImplementedInterfaces();

var mediatrOpenTypes = new[]
{
typeof(IRequestHandler<,>),
typeof(IRequestExceptionHandler<,,>),
typeof(IRequestExceptionAction<,>),
typeof(INotificationHandler<>),
typeof(IStreamRequestHandler<,>)
};
var mediatrOpenTypes = new[]
{
typeof(IRequestHandler<,>),
typeof(IRequestExceptionHandler<,,>),
typeof(IRequestExceptionAction<,>),
typeof(INotificationHandler<>),
typeof(IStreamRequestHandler<,>)
};

foreach (var mediatrOpenType in mediatrOpenTypes)
{
builder
.RegisterAssemblyTypes(typeof(Ping).GetTypeInfo().Assembly)
.AsClosedTypesOf(mediatrOpenType)
// when having a single class implementing several handler types
// this call will cause a handler to be called twice
// in general you should try to avoid having a class implementing for instance `IRequestHandler<,>` and `INotificationHandler<>`
// the other option would be to remove this call
// see also https://github.com/jbogard/MediatR/issues/462
.AsImplementedInterfaces();
}
foreach (var mediatrOpenType in mediatrOpenTypes)
{
builder
.RegisterAssemblyTypes(typeof(Ping).GetTypeInfo().Assembly)
.AsClosedTypesOf(mediatrOpenType)
// when having a single class implementing several handler types
// this call will cause a handler to be called twice
// in general you should try to avoid having a class implementing for instance `IRequestHandler<,>` and `INotificationHandler<>`
// the other option would be to remove this call
// see also https://github.com/jbogard/MediatR/issues/462
.AsImplementedInterfaces();
}

builder.RegisterInstance(writer).As<TextWriter>();
builder.RegisterInstance(writer).As<TextWriter>();

// It appears Autofac returns the last registered types first
builder.RegisterGeneric(typeof(GenericStreamPipelineBehavior<,>)).As(typeof(IStreamPipelineBehavior<,>));
// It appears Autofac returns the last registered types first
builder.RegisterGeneric(typeof(GenericStreamPipelineBehavior<,>)).As(typeof(IStreamPipelineBehavior<,>));

builder.RegisterGeneric(typeof(RequestPostProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(RequestPreProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(RequestExceptionActionProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(RequestExceptionProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(GenericRequestPreProcessor<>)).As(typeof(IRequestPreProcessor<>));
builder.RegisterGeneric(typeof(GenericRequestPostProcessor<,>)).As(typeof(IRequestPostProcessor<,>));
builder.RegisterGeneric(typeof(GenericPipelineBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(ConstrainedRequestPostProcessor<,>)).As(typeof(IRequestPostProcessor<,>));
builder.RegisterGeneric(typeof(ConstrainedPingedHandler<>)).As(typeof(INotificationHandler<>));
builder.RegisterGeneric(typeof(RequestPostProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(RequestPreProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(RequestExceptionActionProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(RequestExceptionProcessorBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(GenericRequestPreProcessor<>)).As(typeof(IRequestPreProcessor<>));
builder.RegisterGeneric(typeof(GenericRequestPostProcessor<,>)).As(typeof(IRequestPostProcessor<,>));
builder.RegisterGeneric(typeof(GenericPipelineBehavior<,>)).As(typeof(IPipelineBehavior<,>));
builder.RegisterGeneric(typeof(ConstrainedRequestPostProcessor<,>)).As(typeof(IRequestPostProcessor<,>));
builder.RegisterGeneric(typeof(ConstrainedPingedHandler<>)).As(typeof(INotificationHandler<>));

builder.Register<ServiceFactory>(ctx =>
{
var c = ctx.Resolve<IComponentContext>();
return t => c.Resolve(t);
});
builder.Register<ServiceFactory>(ctx =>
{
var c = ctx.Resolve<IComponentContext>();
return t => c.Resolve(t);
});

var container = builder.Build();
var container = builder.Build();

// The below returns:
// - RequestPreProcessorBehavior
// - RequestPostProcessorBehavior
// - GenericPipelineBehavior
// - GenericStreamPipelineBehavior
// - RequestExceptionActionProcessorBehavior
// - RequestExceptionProcessorBehavior
// The below returns:
// - RequestPreProcessorBehavior
// - RequestPostProcessorBehavior
// - GenericPipelineBehavior
// - GenericStreamPipelineBehavior
// - RequestExceptionActionProcessorBehavior
// - RequestExceptionProcessorBehavior

//var behaviors = container
// .Resolve<IEnumerable<IPipelineBehavior<Ping, Pong>>>()
// .ToList();
//var behaviors = container
// .Resolve<IEnumerable<IPipelineBehavior<Ping, Pong>>>()
// .ToList();

var mediator = container.Resolve<IMediator>();
var mediator = container.Resolve<IMediator>();

return mediator;
}
return mediator;
}
}
35 changes: 17 additions & 18 deletions samples/MediatR.Examples.DryIoc/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,29 @@
using System.Threading.Tasks;
using DryIoc;

namespace MediatR.Examples.DryIoc
namespace MediatR.Examples.DryIoc;

class Program
{
class Program
static Task Main()
{
static Task Main()
{
var writer = new WrappingWriter(Console.Out);
var mediator = BuildMediator(writer);
var writer = new WrappingWriter(Console.Out);
var mediator = BuildMediator(writer);

return Runner.Run(mediator, writer, "DryIoc");
}
return Runner.Run(mediator, writer, "DryIoc");
}

private static IMediator BuildMediator(WrappingWriter writer)
{
var container = new Container();
private static IMediator BuildMediator(WrappingWriter writer)
{
var container = new Container();

container.RegisterDelegate<ServiceFactory>(r => r.Resolve);
container.UseInstance<TextWriter>(writer);
container.RegisterDelegate<ServiceFactory>(r => r.Resolve);
container.UseInstance<TextWriter>(writer);

//Pipeline works out of the box here
//Pipeline works out of the box here

container.RegisterMany(new[] { typeof(IMediator).GetAssembly(), typeof(Ping).GetAssembly() }, Registrator.Interfaces);
container.RegisterMany(new[] { typeof(IMediator).GetAssembly(), typeof(Ping).GetAssembly() }, Registrator.Interfaces);

return container.Resolve<IMediator>();
}
return container.Resolve<IMediator>();
}
}
}
81 changes: 40 additions & 41 deletions samples/MediatR.Examples.Lamar/Program.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,55 +4,54 @@
using Lamar;
using MediatR.Pipeline;

namespace MediatR.Examples.Lamar
namespace MediatR.Examples.Lamar;

class Program
{
class Program
static Task Main(string[] args)
{
static Task Main(string[] args)
{
var writer = new WrappingWriter(Console.Out);
var mediator = BuildMediator(writer);
var writer = new WrappingWriter(Console.Out);
var mediator = BuildMediator(writer);

return Runner.Run(mediator, writer, "Lamar");
}
return Runner.Run(mediator, writer, "Lamar");
}

private static IMediator BuildMediator(WrappingWriter writer)
private static IMediator BuildMediator(WrappingWriter writer)
{
var container = new Container(cfg =>
{
var container = new Container(cfg =>
cfg.Scan(scanner =>
{
cfg.Scan(scanner =>
{
scanner.AssemblyContainingType<Ping>();
scanner.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>));
scanner.ConnectImplementationsToTypesClosing(typeof(INotificationHandler<>));
scanner.ConnectImplementationsToTypesClosing(typeof(IRequestExceptionAction<>));
scanner.ConnectImplementationsToTypesClosing(typeof(IRequestExceptionHandler<,,>));
});

//Pipeline
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestExceptionProcessorBehavior<,>));
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestExceptionActionProcessorBehavior<,>));
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPreProcessorBehavior<,>));
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPostProcessorBehavior<,>));
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(GenericPipelineBehavior<,>));
cfg.For(typeof(IRequestPreProcessor<>)).Add(typeof(GenericRequestPreProcessor<>));
cfg.For(typeof(IRequestPostProcessor<,>)).Add(typeof(GenericRequestPostProcessor<,>));
cfg.For(typeof(IRequestPostProcessor<,>)).Add(typeof(ConstrainedRequestPostProcessor<,>));

//Constrained notification handlers
cfg.For(typeof(INotificationHandler<>)).Add(typeof(ConstrainedPingedHandler<>));

// This is the default but let's be explicit. At most we should be container scoped.
cfg.For<IMediator>().Use<Mediator>().Transient();

cfg.For<ServiceFactory>().Use(ctx => ctx.GetInstance);
cfg.For<TextWriter>().Use(writer);
scanner.AssemblyContainingType<Ping>();
scanner.ConnectImplementationsToTypesClosing(typeof(IRequestHandler<,>));
scanner.ConnectImplementationsToTypesClosing(typeof(INotificationHandler<>));
scanner.ConnectImplementationsToTypesClosing(typeof(IRequestExceptionAction<>));
scanner.ConnectImplementationsToTypesClosing(typeof(IRequestExceptionHandler<,,>));
});

//Pipeline
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestExceptionProcessorBehavior<,>));
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestExceptionActionProcessorBehavior<,>));
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPreProcessorBehavior<,>));
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(RequestPostProcessorBehavior<,>));
cfg.For(typeof(IPipelineBehavior<,>)).Add(typeof(GenericPipelineBehavior<,>));
cfg.For(typeof(IRequestPreProcessor<>)).Add(typeof(GenericRequestPreProcessor<>));
cfg.For(typeof(IRequestPostProcessor<,>)).Add(typeof(GenericRequestPostProcessor<,>));
cfg.For(typeof(IRequestPostProcessor<,>)).Add(typeof(ConstrainedRequestPostProcessor<,>));

//Constrained notification handlers
cfg.For(typeof(INotificationHandler<>)).Add(typeof(ConstrainedPingedHandler<>));

// This is the default but let's be explicit. At most we should be container scoped.
cfg.For<IMediator>().Use<Mediator>().Transient();

cfg.For<ServiceFactory>().Use(ctx => ctx.GetInstance);
cfg.For<TextWriter>().Use(writer);
});


var mediator = container.GetInstance<IMediator>();
var mediator = container.GetInstance<IMediator>();

return mediator;
}
return mediator;
}
}
}
Loading

0 comments on commit c4f1a91

Please sign in to comment.