Skip to content

Commit

Permalink
remove Autofac, add Scrutor, use Microsoft Dependency Injection
Browse files Browse the repository at this point in the history
  • Loading branch information
DanElliott committed Jan 27, 2024
1 parent cdfe594 commit b233894
Show file tree
Hide file tree
Showing 8 changed files with 157 additions and 166 deletions.
3 changes: 1 addition & 2 deletions Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,6 @@
<PackageVersion Include="Ardalis.SmartEnum" Version="7.0.0" />
<PackageVersion Include="Ardalis.Specification" Version="8.0.0" />
<PackageVersion Include="Ardalis.Specification.EntityFrameworkCore" Version="8.0.0" />
<PackageVersion Include="Autofac" Version="7.1.0" />
<PackageVersion Include="Autofac.Extensions.DependencyInjection" Version="8.0.0" />
<PackageVersion Include="coverlet.collector" Version="6.0.0" />
<PackageVersion Include="FastEndpoints" Version="5.20.0" />
<PackageVersion Include="FastEndpoints.ApiExplorer" Version="2.2.0" />
Expand All @@ -30,6 +28,7 @@
<PackageVersion Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="8.0.0" />
<PackageVersion Include="NSubstitute" Version="5.1.0" />
<PackageVersion Include="ReportGenerator" Version="5.2.0" />
<PackageVersion Include="Scrutor" Version="4.2.2" />
<PackageVersion Include="Serilog.AspNetCore" Version="8.0.0" />
<PackageVersion Include="SQLite" Version="3.13.0" />
<PackageVersion Include="Swashbuckle.AspNetCore" Version="6.5.0" />
Expand Down
1 change: 0 additions & 1 deletion src/CleanArchitecture.Core/CleanArchitecture.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
<PackageReference Include="Ardalis.SharedKernel" />
<PackageReference Include="Ardalis.SmartEnum" />
<PackageReference Include="Ardalis.Specification" />
<PackageReference Include="Autofac" />
<PackageReference Include="MediatR" />
<PackageReference Include="Microsoft.Extensions.Logging.Abstractions" />
</ItemGroup>
Expand Down
17 changes: 0 additions & 17 deletions src/CleanArchitecture.Core/DefaultCoreModule.cs

This file was deleted.

15 changes: 15 additions & 0 deletions src/CleanArchitecture.Core/DependencyInjection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using Microsoft.Extensions.DependencyInjection;
using CleanArchitecture.Core.Interfaces;
using CleanArchitecture.Core.Services;

namespace CleanArchitecture.Core;
public static class DependencyInjection
{
public static IServiceCollection AddCore(this IServiceCollection services)
{
services
.AddScoped<IDeleteContributorService, DeleteContributorService>();

return services;
}
}
134 changes: 0 additions & 134 deletions src/CleanArchitecture.Infrastructure/AutofacInfrastructureModule.cs

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -4,13 +4,12 @@
<ItemGroup>
<PackageReference Include="Ardalis.SharedKernel" />
<PackageReference Include="Ardalis.Specification.EntityFrameworkCore" />
<PackageReference Include="Autofac" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" />
<PackageReference Include="MailKit" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Relational" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" PrivateAssets="all" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" />
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" />
<PackageReference Include="Scrutor" />
<PackageReference Include="SQLite" />
</ItemGroup>

Expand Down
137 changes: 137 additions & 0 deletions src/CleanArchitecture.Infrastructure/DependencyInjection.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,137 @@
using System.Reflection;
using Ardalis.SharedKernel;
using MediatR;
using MediatR.Pipeline;
using Microsoft.Extensions.DependencyInjection;
using CleanArchitecture.Core.ContributorAggregate;
using CleanArchitecture.Core.Interfaces;
using CleanArchitecture.Infrastructure.Data;
using CleanArchitecture.Infrastructure.Data.Queries;
using CleanArchitecture.Infrastructure.Email;
using CleanArchitecture.UseCases.Contributors.Create;
using CleanArchitecture.UseCases.Contributors.List;

namespace CleanArchitecture.Infrastructure;
public static class DependencyInjection
{
private static bool _isDevelopment;
private static readonly List<Assembly> _assemblies = [];

public static IServiceCollection AddInfrastructure(this IServiceCollection services, bool isDevelopment, Assembly? callingAssembly = null)
{
_isDevelopment = isDevelopment;
AddToAssembliesIfNotNull(callingAssembly);

LoadAssemblies();

if (isDevelopment)
{
services.RegisterDevelopmentOnlyDependencies();
}
else
{
services.RegisterProductionOnlyDependencies();
}

services
.RegisterEF()
.RegisterQueries()
.RegisterMediatR();

return services;
}

private static void AddToAssembliesIfNotNull(Assembly? assembly)
{
if (assembly != null)
{
_assemblies.Add(assembly);
}
}

private static void LoadAssemblies()
{
// TODO: Replace these types with any type in the appropriate assembly/project
var coreAssembly = Assembly.GetAssembly(typeof(Contributor));
var infrastructureAssembly = Assembly.GetAssembly(typeof(DependencyInjection));
var useCasesAssembly = Assembly.GetAssembly(typeof(CreateContributorCommand));

AddToAssembliesIfNotNull(coreAssembly);
AddToAssembliesIfNotNull(infrastructureAssembly);
AddToAssembliesIfNotNull(useCasesAssembly);
}

private static IServiceCollection RegisterEF(this IServiceCollection services)
{
services
.AddScoped(typeof(IRepository<>), typeof(EfRepository<>));

services
.AddScoped(typeof(IReadRepository<>), typeof(EfRepository<>));

return services;
}

private static IServiceCollection RegisterQueries(this IServiceCollection services)
{
services
.AddScoped<IListContributorsQueryService, ListContributorsQueryService>();

return services;
}

private static IServiceCollection RegisterMediatR(this IServiceCollection services)
{
services
.AddMediatR(config =>
{
config.RegisterServicesFromAssembly(typeof(DependencyInjection).Assembly);
config.AddOpenBehavior(typeof(LoggingBehavior<,>));
});

services.AddTransient<IDomainEventDispatcher, MediatRDomainEventDispatcher>();

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

foreach (var mediatrOpenType in mediatrOpenTypes)
{
// register all the open types (concrete types) that implement the interfaces above using Scrutor
services
.Scan(selector => selector
.FromAssemblies(_assemblies)
.AddClasses(classes => classes.AssignableTo(mediatrOpenType))
.AsImplementedInterfaces()
.WithScopedLifetime());
}

return services;
}

private static IServiceCollection RegisterDevelopmentOnlyDependencies(this IServiceCollection services)
{
// NOTE: Add any development only services here
services
.AddScoped<IEmailSender, FakeEmailSender>();

//services
// .AddScoped<IListContributorsQueryService, FakeListContributorsQueryService>();

return services;
}

private static IServiceCollection RegisterProductionOnlyDependencies(this IServiceCollection services)
{
// NOTE: Add any production only (real) services here
services
.AddScoped<IEmailSender, FakeEmailSender>();

return services;
}
}
13 changes: 3 additions & 10 deletions src/CleanArchitecture.Web/Program.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
using Ardalis.GuardClauses;
using Ardalis.ListStartupServices;
using Autofac;
using Autofac.Extensions.DependencyInjection;
using CleanArchitecture.Core;
using CleanArchitecture.Infrastructure;
using CleanArchitecture.Infrastructure.Data;
Expand All @@ -11,8 +9,6 @@

var builder = WebApplication.CreateBuilder(args);

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

builder.Host.UseSerilog((_, config) => config.ReadFrom.Configuration(builder.Configuration));

builder.Services.Configure<CookiePolicyOptions>(options =>
Expand Down Expand Up @@ -40,12 +36,9 @@
config.Path = "/listservices";
});


builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
{
containerBuilder.RegisterModule(new DefaultCoreModule());
containerBuilder.RegisterModule(new AutofacInfrastructureModule(builder.Environment.IsDevelopment()));
});
builder.Services
.AddCore()
.AddInfrastructure(builder.Environment.IsDevelopment());

var app = builder.Build();

Expand Down

0 comments on commit b233894

Please sign in to comment.