public static ICollection <Type> GetMessageHandlerTypes(this Type messageHandler) { if (messageHandler == null) { throw new ArgumentNullException("messageHandler"); } ICollection <Type> types; if (MessageHandlerTypes.TryGetValue(messageHandler, out types)) { return(types); } MessageHandlerTypes[messageHandler] = types = new HashSet <Type>(); messageHandler.GetInterfaces() .Where(x => x.IsGenericType) .Where(x => x.GetGenericTypeDefinition() == typeof(IMessageHandler <>)) .Select(x => x.GetGenericArguments().First()) .ToList() .ForEach(types.Add); return(types); }
/// <summary> /// This method gets called by the runtime and adds services to the container. /// </summary> /// <param name="services">Service collection to be populated with Muplonen services.</param> public void ConfigureServices(IServiceCollection services) { services.AddControllers(); // Register database services.AddDbContextPool <MuplonenDbContext>(options => options.UseNpgsql(Configuration.GetConnectionString("muplonen"))); // Register singletons services.AddSingleton <MessageHandlerTypes>(); services.AddSingleton <IPlayerSessionManager, PlayerSessionManager>(); services.AddSingleton <IPasswordHasher, PasswordHasher>(); services.AddSingleton <IRoomManager, RoomManager>(); // Register poool for message objects services.TryAddSingleton <ObjectPoolProvider, DefaultObjectPoolProvider>(); services.TryAddSingleton <ObjectPool <GodotMessage> >(serviceProvider => { var provider = serviceProvider.GetRequiredService <ObjectPoolProvider>(); var policy = new GodotMessagePooledObjectPolicy(); return(provider.Create <GodotMessage>(policy)); }); services.AddTransient <IRoomInstance, RoomInstance>(); // Register message handlers foreach (Type messageHandler in MessageHandlerTypes.FindMessageHandlersInAssembly()) { services.AddScoped(messageHandler); } InitializeDatabase(services); // Start services services.AddHostedService <PlayerTimeoutDetectionService>(); }
/// <summary> /// Creates a new <see cref="PlayerSessionManager"/> instance. /// </summary> /// <param name="messageHandlerTypes">Available message handler types.</param> /// <param name="messageObjectPool">Pool for message objects.</param> /// <param name="serviceProvider">Service provider for fetching implementations.</param> /// <param name="logger">Logging.</param> public PlayerSessionManager( MessageHandlerTypes messageHandlerTypes, ObjectPool <GodotMessage> messageObjectPool, IServiceProvider serviceProvider, ILogger <PlayerSessionManager> logger) { _messageHandlerTypes = messageHandlerTypes; _messageObjectPool = messageObjectPool; _serviceProvider = serviceProvider; _logger = logger; }
public void GetAll_MessageHandlers_ReturnsEachHandlerExactlyOnce() { var expectedHandlers = new List <Type> { typeof(DuoHandler), typeof(HandlerA), typeof(HandlerA1), typeof(HandlerA2), typeof(HandlerB), typeof(HandlerWithLabelAttribute) }; var messageHandlers = MessageHandlerTypes.GetAll(Assembly.GetExecutingAssembly()); messageHandlers.Should().BeEquivalentTo(expectedHandlers); }