zeroframework/Services/DeviceCenter/ZeroFramework.DeviceCenter.Application/DependencyRegistrar.cs
2023-12-05 17:22:48 +08:00

170 lines
9.0 KiB
C#

using FluentValidation;
using MediatR;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using System.Reflection;
using ZeroFramework.DeviceCenter.Application.Behaviors;
using ZeroFramework.DeviceCenter.Application.Infrastructure;
using ZeroFramework.DeviceCenter.Application.Models.Monitoring;
using ZeroFramework.DeviceCenter.Application.Models.Projects;
using ZeroFramework.DeviceCenter.Application.Queries.Factories;
using ZeroFramework.DeviceCenter.Application.Queries.Monitoring;
using ZeroFramework.DeviceCenter.Application.Queries.Ordering;
using ZeroFramework.DeviceCenter.Application.Services.Devices;
using ZeroFramework.DeviceCenter.Application.Services.Generics;
using ZeroFramework.DeviceCenter.Application.Services.Measurements;
using ZeroFramework.DeviceCenter.Application.Services.Ordering;
using ZeroFramework.DeviceCenter.Application.Services.Permissions;
using ZeroFramework.DeviceCenter.Application.Services.Products;
using ZeroFramework.DeviceCenter.Application.Services.Projects;
using ZeroFramework.DeviceCenter.Application.Services.ResourceGroups;
using ZeroFramework.DeviceCenter.Application.Services.Tenants;
using ZeroFramework.DeviceCenter.Domain.Aggregates.MonitoringAggregate;
using ZeroFramework.DeviceCenter.Domain.Repositories;
using ZeroFramework.DeviceCenter.Infrastructure.Constants;
using ZeroFramework.DeviceCenter.Infrastructure.Idempotency;
using ZeroFramework.EventBus;
using ZeroFramework.EventBus.Abstractions;
using ZeroFramework.EventBus.RabbitMQ;
namespace ZeroFramework.DeviceCenter.Application
{
public static class DependencyRegistrar
{
public static IServiceCollection AddApplicationLayer(this IServiceCollection services, IConfiguration configuration)
{
services.AddDomainEvents();
services.AddEventBus(configuration).AddIntegrationEvents();
services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());
services.AddQueries(configuration);
services.AddApplicationServices();
services.AddAuthorization();
return services;
}
private static IServiceCollection AddDomainEvents(this IServiceCollection services)
{
// Registers handlers and mediator types from the specified assemblies
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(LoggingBehavior<,>));
services.AddTransient(typeof(IPipelineBehavior<,>), typeof(ValidatorBehavior<,>));
services.AddMediatR(config => config.RegisterServicesFromAssemblies(AppDomain.CurrentDomain.GetAssemblies()));
ValidatorOptions.Global.LanguageManager = new Extensions.Validators.CustomLanguageManager();
services.AddValidatorsFromAssembly(Assembly.GetExecutingAssembly());
services.AddTransient<IRequestManager, RequestManager>();
return services;
}
private static IServiceCollection AddEventBus(this IServiceCollection services, IConfiguration configuration)
{
services.AddSingleton<IEventBusSubscriptionsManager, InMemoryEventBusSubscriptionsManager>();
IConfigurationSection configurationSection = configuration.GetSection("EventBus");
int retryCount = 5;
if (!string.IsNullOrEmpty(configurationSection["EventBusRetryCount"]))
{
retryCount = int.Parse(configurationSection["EventBusRetryCount"]!);
}
services.AddSingleton<IRabbitMQPersistentConnection>(sp =>
{
var logger = sp.GetRequiredService<ILogger<DefaultRabbitMQPersistentConnection>>();
var factory = new RabbitMQ.Client.ConnectionFactory()
{
HostName = configurationSection["EventBusConnection"],
DispatchConsumersAsync = true
};
if (!string.IsNullOrEmpty(configurationSection["EventBusUserName"]))
{
factory.UserName = configurationSection["EventBusUserName"];
}
if (!string.IsNullOrEmpty(configurationSection["EventBusPassword"]))
{
factory.Password = configurationSection["EventBusPassword"];
}
return new DefaultRabbitMQPersistentConnection(factory, logger, retryCount);
});
services.AddSingleton<IEventBus, EventBusRabbitMQ>(sp =>
{
var rabbitMQPersistentConnection = sp.GetRequiredService<IRabbitMQPersistentConnection>();
var logger = sp.GetRequiredService<ILogger<EventBusRabbitMQ>>();
var eventBusSubcriptionsManager = sp.GetRequiredService<IEventBusSubscriptionsManager>();
string queueName = configurationSection["SubscriptionClientName"]!;
return new EventBusRabbitMQ(rabbitMQPersistentConnection, logger, sp, eventBusSubcriptionsManager, queueName, retryCount);
});
return services;
}
private static IServiceCollection AddIntegrationEvents(this IServiceCollection services)
{
var exportedTypes = Assembly.GetExecutingAssembly().ExportedTypes;
var integrationEventHandlers = exportedTypes.Where(t => t.IsAssignableTo(typeof(IIntegrationEventHandler)) && t.IsClass);
integrationEventHandlers.ToList().ForEach(t => services.AddTransient(typeof(IIntegrationEventHandler), t));
services.AddTransient<IIntegrationEventService, IntegrationEventService>();
return services;
}
private static IServiceCollection AddQueries(this IServiceCollection services, IConfiguration configuration)
{
services.AddSingleton<IDbConnectionFactory, DbConnectionFactory>();
string connectionString = configuration.GetConnectionString(DbConstants.DefaultConnectionStringName)!;
services.AddTransient<IOrderQueries>(o => new OrderQueries(connectionString));
services.AddTransient<IMonitoringFactorQueries, MonitoringFactorQueries>();
return services;
}
private static IServiceCollection AddApplicationServices(this IServiceCollection services)
{
var exportedTypes = Assembly.GetExecutingAssembly().ExportedTypes;
var dataSeedProviders = exportedTypes.Where(t => t.IsAssignableTo(typeof(IDataSeedProvider)) && t.IsClass);
dataSeedProviders.ToList().ForEach(t => services.AddTransient(typeof(IDataSeedProvider), t));
services.AddTransient(typeof(ICrudApplicationService<int, ProjectGetResponseModel, PagedRequestModel, ProjectGetResponseModel, ProjectCreateOrUpdateRequestModel, ProjectCreateOrUpdateRequestModel>), typeof(ProjectApplicationService));
services.AddTransient(typeof(ICrudApplicationService<int, MonitoringFactorGetResponseModel, MonitoringFactorPagedRequestModel, MonitoringFactorGetResponseModel, MonitoringFactorCreateRequestModel, MonitoringFactorUpdateRequestModel>), typeof(CrudApplicationService<MonitoringFactor, int, MonitoringFactorGetResponseModel, MonitoringFactorPagedRequestModel, MonitoringFactorGetResponseModel, MonitoringFactorCreateRequestModel, MonitoringFactorUpdateRequestModel>));
services.AddTransient<IOrderApplicationService, OrderApplicationService>();
services.AddTransient<IProductApplicationService, ProductApplicationService>();
services.AddTransient<ITenantApplicationService, TenantApplicationService>();
services.AddTransient<IPermissionApplicationService, PermissionApplicationService>();
services.AddTransient<IResourceGroupApplicationService, ResourceGroupApplicationService>();
services.AddTransient<IMeasurementUnitApplicationService, MeasurementUnitApplicationService>();
services.AddTransient<IDeviceApplicationService, DeviceApplicationService>();
services.AddTransient<IDeviceDataApplicationService, DeviceDataApplicationService>();
services.AddTransient<IDeviceGroupApplicationService, DeviceGroupApplicationService>();
return services;
}
private static IServiceCollection AddAuthorization(this IServiceCollection services)
{
services.AddDistributedMemoryCache().AddTransient<IPermissionStore, PermissionStore>();
services.AddTransient<IPermissionDefinitionManager, PermissionDefinitionManager>();
var exportedTypes = AppDomain.CurrentDomain.GetAssemblies().SelectMany(a => a.ExportedTypes).Where(t => t.IsClass);
var permissionDefinitionProviders = exportedTypes.Where(t => t.IsAssignableTo(typeof(IPermissionDefinitionProvider)));
permissionDefinitionProviders.ToList().ForEach(t => services.AddSingleton(typeof(IPermissionDefinitionProvider), t));
var permissionValueProviders = exportedTypes.Where(t => t.IsAssignableTo(typeof(IPermissionValueProvider)));
permissionValueProviders.ToList().ForEach(t => services.AddTransient(typeof(IPermissionValueProvider), t));
return services;
}
}
}