Exemple #1
0
        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);
        }
Exemple #2
0
        /// <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);
        }