Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit 0a424d0

Browse files
IDependencyRegistrar implemented
1 parent 58080b2 commit 0a424d0

File tree

13 files changed

+1407
-4
lines changed

13 files changed

+1407
-4
lines changed

‎src/AspnetRunAngular.Api/AspnetRunAngular.Api.csproj

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,6 @@
66
</PropertyGroup>
77

88
<ItemGroup>
9-
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.4.0" />
109
<PackageReference Include="FluentValidation.AspNetCore" Version="8.4.0" />
1110
<PackageReference Include="MediatR" Version="7.0.0" />
1211
<PackageReference Include="Microsoft.AspNetCore.App" />
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using AspnetRunAngular.Api.Application.Behaviors;
2+
using AspnetRunAngular.Api.Application.Validations;
3+
using AspnetRunAngular.Api.Requests;
4+
using AspnetRunAngular.Infrastructure.IoC;
5+
using AspnetRunAngular.Infrastructure.Misc;
6+
using Autofac;
7+
using FluentValidation;
8+
using MediatR;
9+
using System.Reflection;
10+
11+
namespace AspnetRunAngular.Api.IoC
12+
{
13+
public class DependencyRegistrar : IDependencyRegistrar
14+
{
15+
public void Register(ContainerBuilder builder, ITypeFinder typeFinder)
16+
{
17+
builder.RegisterAssemblyTypes(typeof(IMediator).GetTypeInfo().Assembly)
18+
.AsImplementedInterfaces();
19+
20+
// Register all the Command classes (they implement IRequestHandler) in assembly holding the Commands
21+
builder.RegisterAssemblyTypes(typeof(CreateProductRequest).GetTypeInfo().Assembly)
22+
.AsClosedTypesOf(typeof(IRequestHandler<,>));
23+
24+
builder.Register<ServiceFactory>(context =>
25+
{
26+
var componentContext = context.Resolve<IComponentContext>();
27+
return t => { object o; return componentContext.TryResolve(t, out o) ? o : null; };
28+
});
29+
30+
builder.RegisterGeneric(typeof(TransactionBehaviour<,>)).As(typeof(IPipelineBehavior<,>));
31+
32+
33+
// Register the Command's Validators (Validators based on FluentValidation library)
34+
builder.RegisterAssemblyTypes(typeof(CreateProductRequestValidator).GetTypeInfo().Assembly)
35+
.Where(t => t.IsClosedTypeOf(typeof(IValidator<>)))
36+
.AsImplementedInterfaces();
37+
}
38+
39+
public int Order => 0;
40+
}
41+
}

‎src/AspnetRunAngular.Api/Startup.cs

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
using System;
2+
using System.Linq;
23
using AspnetRunAngular.Api.Application.Middlewares;
34
using AspnetRunAngular.Core.Configuration;
45
using AspnetRunAngular.Infrastructure.Data;
6+
using AspnetRunAngular.Infrastructure.IoC;
7+
using AspnetRunAngular.Infrastructure.Misc;
58
using Autofac;
69
using Autofac.Extensions.DependencyInjection;
710
using FluentValidation.AspNetCore;
@@ -19,13 +22,16 @@ namespace AspnetRunAngular.Api
1922
{
2023
public class Startup
2124
{
22-
public Startup(IConfiguration configuration)
25+
26+
public Startup(IConfiguration configuration, IHostingEnvironment hostingEnvironment)
2327
{
2428
Configuration = configuration;
29+
HostingEnvironment = hostingEnvironment;
2530
AspnetRunSettings = configuration.Get<AspnetRunSettings>();
2631
}
2732

2833
public IConfiguration Configuration { get; }
34+
public IHostingEnvironment HostingEnvironment { get; }
2935
public AspnetRunSettings AspnetRunSettings { get; }
3036

3137
// This method gets called by the runtime. Use this method to add services to the container.
@@ -37,7 +43,7 @@ public IServiceProvider ConfigureServices(IServiceCollection services)
3743
.AddCustomDbContext(AspnetRunSettings)
3844
.AddCustomSwagger()
3945
.AddCustomConfiguration(Configuration)
40-
.AddCustomIntegrations();
46+
.AddCustomIntegrations(HostingEnvironment);
4147
}
4248

4349
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
@@ -178,14 +184,35 @@ public static IServiceCollection AddCustomConfiguration(this IServiceCollection
178184
return services;
179185
}
180186

181-
public static IServiceProvider AddCustomIntegrations(this IServiceCollection services)
187+
public static IServiceProvider AddCustomIntegrations(this IServiceCollection services,IHostingEnvironmenthostingEnvironment)
182188
{
183189
services.AddHttpContextAccessor();
184190

191+
var fileProvider = new AppFileProvider(hostingEnvironment);
192+
var typeFinder = new WebAppTypeFinder(fileProvider);
193+
185194
//configure autofac
186195
var containerBuilder = new ContainerBuilder();
196+
197+
//register type finder
198+
containerBuilder.RegisterInstance(fileProvider).As<IAppFileProvider>().SingleInstance();
199+
containerBuilder.RegisterInstance(typeFinder).As<ITypeFinder>().SingleInstance();
200+
201+
//populate Autofac container builder with the set of registered service descriptors
187202
containerBuilder.Populate(services);
188203

204+
//find dependency registrars provided by other assemblies
205+
var dependencyRegistrars = typeFinder.FindClassesOfType<IDependencyRegistrar>();
206+
207+
//create and sort instances of dependency registrars
208+
var instances = dependencyRegistrars
209+
.Select(dependencyRegistrar => (IDependencyRegistrar)Activator.CreateInstance(dependencyRegistrar))
210+
.OrderBy(dependencyRegistrar => dependencyRegistrar.Order);
211+
212+
//register all provided dependencies
213+
foreach (var dependencyRegistrar in instances)
214+
dependencyRegistrar.Register(containerBuilder, typeFinder);
215+
189216
return new AutofacServiceProvider(containerBuilder.Build());
190217
}
191218
}

‎src/AspnetRunAngular.Application/AspnetRunAngular.Application.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
<ItemGroup>
1212
<ProjectReference Include="..\AspnetRunAngular.Core\AspnetRunAngular.Core.csproj" />
13+
<ProjectReference Include="..\AspnetRunAngular.Infrastructure\AspnetRunAngular.Infrastructure.csproj" />
1314
</ItemGroup>
1415

1516
</Project>
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
using AspnetRunAngular.Application.Interfaces;
2+
using AspnetRunAngular.Application.Services;
3+
using AspnetRunAngular.Infrastructure.IoC;
4+
using AspnetRunAngular.Infrastructure.Misc;
5+
using Autofac;
6+
7+
namespace AspnetRunAngular.Application.IoC
8+
{
9+
public class DependencyRegistrar : IDependencyRegistrar
10+
{
11+
public void Register(ContainerBuilder builder, ITypeFinder typeFinder)
12+
{
13+
// services
14+
builder.RegisterType<ProductService>().As<IProductService>().InstancePerLifetimeScope();
15+
builder.RegisterType<CategoryService>().As<ICategoryService>().InstancePerLifetimeScope();
16+
}
17+
18+
public int Order => 2;
19+
}
20+
}

‎src/AspnetRunAngular.Infrastructure/AspnetRunAngular.Infrastructure.csproj

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@
55
</PropertyGroup>
66

77
<ItemGroup>
8+
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="4.4.0" />
9+
<PackageReference Include="Microsoft.AspNetCore.Hosting" Version="2.2.0" />
810
<PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="2.2.4" />
11+
<PackageReference Include="System.IO.FileSystem.AccessControl" Version="4.5.0" />
912
</ItemGroup>
1013

1114
<ItemGroup>
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
using AspnetRunAngular.Core.Interfaces;
2+
using AspnetRunAngular.Core.Repositories;
3+
using AspnetRunAngular.Core.Repositories.Base;
4+
using AspnetRunAngular.Infrastructure.Data;
5+
using AspnetRunAngular.Infrastructure.Logging;
6+
using AspnetRunAngular.Infrastructure.Misc;
7+
using AspnetRunAngular.Infrastructure.Repository;
8+
using AspnetRunAngular.Infrastructure.Repository.Base;
9+
using Autofac;
10+
11+
namespace AspnetRunAngular.Infrastructure.IoC
12+
{
13+
public class DependencyRegistrar : IDependencyRegistrar
14+
{
15+
public void Register(ContainerBuilder builder, ITypeFinder typeFinder)
16+
{
17+
// repositories
18+
builder.RegisterType<ProductRepository>().As<IProductRepository>().InstancePerDependency();
19+
builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerDependency();
20+
builder.RegisterGeneric(typeof(EnumRepository<>)).As(typeof(IEnumRepository<>)).InstancePerDependency();
21+
builder.RegisterGeneric(typeof(RepositoryBase<,>)).As(typeof(IRepositoryBase<,>)).InstancePerDependency();
22+
23+
builder.RegisterGeneric(typeof(LoggerAdapter<>)).As(typeof(IAppLogger<>)).InstancePerDependency();
24+
25+
builder.RegisterType<AspnetRunContextSeed>();
26+
}
27+
28+
public int Order => 1;
29+
}
30+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
using AspnetRunAngular.Infrastructure.Misc;
2+
using Autofac;
3+
4+
namespace AspnetRunAngular.Infrastructure.IoC
5+
{
6+
public interface IDependencyRegistrar
7+
{
8+
void Register(ContainerBuilder builder, ITypeFinder typeFinder);
9+
10+
int Order { get; }
11+
}
12+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /