using System;
using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using xCommons.Extensions;
using xEventService.Configuration;
using xEventService.Constants;
using xEventService.Interfaces;
using xEventService.Models;
using xEventService.Providers;
namespace xEventService.DI {
public static partial class XDIHelperExtension {
///
/// Extract EventService Configurations ...
///
///
///
public static XEventServiceConfiguration GetXEventServiceConfigurations (this IConfiguration source) {
//
var configSection = source
.GetSection (ConfigurationNodeNames.EVENT_SERVICE_NODE_NAME);
var result = configSection.Get ();
//
return result;
}
///
/// Register Event Service Configurations ...
///
///
///
public static void AddXEventServiceConfigurations (
this IServiceCollection services,
IConfiguration configuration
) {
//
var config = configuration.GetXEventServiceConfigurations ();
services.AddXEventServiceConfigurations (config);
}
///
/// Register Event Service Configurations ...
///
///
///
public static void AddXEventServiceConfigurations (
this IServiceCollection services,
XEventServiceConfiguration configuration
) {
//
services.AddSingleton (configuration);
}
///
/// Register Event Service ...
///
///
///
public static void AddXEventService (
this IServiceCollection services,
IConfiguration configuration
) {
//
// Check Configuration Registered ...
var config = services.GetRegisteredService ();
if (config.IsNull ()) {
//
Console.WriteLine ($"XEventService: there is no provided XEventServiceConfiguration, using default ...");
//
// Register Default Configuration ...
services.AddXEventServiceConfigurations (configuration);
}
//
// Register IXEventBus ...
var serviceBas = services.GetRegisteredService ();
if (serviceBas.IsNull ()) {
services.AddSingleton ();
}
}
///
/// Register an Event Handler ...
///
///
///
///
///
///
public static void AddXEventHandler (
this IServiceCollection services,
ServiceLifetime lifetime = ServiceLifetime.Transient
)
where TEvent : XEvent
where THandler : IXEventHandler {
//
services.Add (new ServiceDescriptor (
serviceType: typeof (THandler),
implementationType: typeof (THandler),
lifetime: lifetime
));
//
services.Add (new ServiceDescriptor (
serviceType: typeof (IXEventHandler),
implementationType: typeof (THandler),
lifetime: lifetime
));
}
///
/// Subscribe to specific Event ...
///
///
///
///
///
public static void XEventSubscribe (
this IApplicationBuilder app,
bool toExchange = true
)
where TEvent : XEvent
where THandler : IXEventHandler {
//
var eventName = typeof (TEvent).Name;
//
// Retrieve EventBus from IOC ...
var eventBus = app.ApplicationServices.GetRequiredService ();
//
// Subscribe to Event Handler ...
var isSubscribed = eventBus.Subscribe ();
Console.WriteLine ($"XEventService: Event Handler subscription result: {eventName} => {isSubscribed} ...");
}
}
}