Exemple #1
0
    public void Add_typeがnullの場合は例外が発生する()
    {
        var    registry = new ListenerRegistry();
        Action act      = () => registry.Add(null);

        act.Should().Throw <ArgumentNullException>();
    }
Exemple #2
0
    public async Task PublishAsync_Listener実行前に例外が発生した場合はリスナーが実行されずにログが出力される()
    {
        var services = new ServiceCollection();
        services.AddMediatR(typeof(MixedRequest).Assembly);
        services.AddSingleton<MixedTaskHolder>();
        var provider = services.BuildServiceProvider();

        var serviceFactory = provider.GetService<ServiceFactory>();
        var registry = new ListenerRegistry();
        registry.Add(typeof(MixedRequest));
        registry.Add(typeof(MixedNotification));

        var holder = provider.GetService<MixedTaskHolder>();

        var testLogger = new TestLogger();
        var client = new DefaultMediatorClient(new ServiceRegistry(), registry,
            serviceFactory!, new TestScopedServiceFactoryFactory(), testLogger);

        await client.PublishAsync("mixed", new { });

        // Fire and forgetのため一旦スリープ
        Thread.Sleep(1000);

        holder.Messages.Should().HaveCount(0);
        testLogger.Errors.Should().HaveCount(1);
    }
Exemple #3
0
    public async Task PublishAsync_Mediatorが実行される()
    {
        var services = new ServiceCollection();
        services.AddMediatR(typeof(ServicePing).Assembly);

        services.AddSingleton<TaskHolder>();
        var provider = services.BuildServiceProvider();

        var serviceFactory = provider.GetService<ServiceFactory>();
        var registry = new ListenerRegistry();
        registry.Add(typeof(MediatorClientTestPang));

        var client = new DefaultMediatorClient(new ServiceRegistry(), registry,
            serviceFactory!, new InternalScopedServiceFactoryFactory(serviceFactory!), new TestLogger());

        var holder = provider.GetService<TaskHolder>();

        var pang = new MediatorClientTestPang();
        await client.PublishAsync(nameof(MediatorClientTestPang), pang);

        Thread.Sleep(1000); //それぞれで10だけまたしているため、1000あれば終わっているはず。

        await Task.WhenAll(holder.Tasks);
        holder.Messages.Should().HaveCount(3).And.Contain("1", "2", "3");
        holder.Pangs.Should().HaveCount(3);

        var paramBang = holder.Pangs[0];
        foreach (var bangItem in holder.Pangs)
        {
            paramBang.Should().Be(bangItem);
        }
    }
Exemple #4
0
    public async Task PublishAsync_RequestもNotificationも実行される()
    {
        var services = new ServiceCollection();
        services.AddMediatR(typeof(MixedRequest).Assembly);
        services.AddSingleton<MixedTaskHolder>();
        var provider = services.BuildServiceProvider();

        var serviceFactory = provider.GetService<ServiceFactory>();
        var registry = new ListenerRegistry();
        registry.Add(typeof(MixedRequest));
        registry.Add(typeof(MixedNotification));

        var holder = provider.GetService<MixedTaskHolder>();

        var client = new DefaultMediatorClient(new ServiceRegistry(), registry,
            serviceFactory!, new InternalScopedServiceFactoryFactory(serviceFactory!), new TestLogger());

        await client.PublishAsync("mixed", new { });

        // Fire and forgetのため一旦スリープ
        Thread.Sleep(1000);

        holder.Messages.Should().HaveCount(2);
        holder.Messages.Contains("request").Should().BeTrue();
        holder.Messages.Contains("notification").Should().BeTrue();
    }
Exemple #5
0
        public void RegisterEventListener <T>(uint id)
        {
            System.Type key = typeof(T);
            if (!this._evtListeners.ContainsKey(key))
            {
                this._evtListeners.Add(key, new List <ListenerRegistry>());
            }
            List <ListenerRegistry> list = this._evtListeners[key];
            bool flag = false;

            for (int i = 0; i < list.Count; i++)
            {
                if (list[i].listenerID == id)
                {
                    ListenerRegistry local1 = list[i];
                    local1.registerCount++;
                    flag = true;
                    break;
                }
            }
            if (!flag)
            {
                list.Add(new ListenerRegistry(id));
            }
        }
Exemple #6
0
    public void Add_AsEventが付与されている場合は追加される()
    {
        var registry = new ListenerRegistry();

        registry.Add(typeof(Pang));
        var ev = registry.GetListeners("pang");

        ev.Should().NotBeNull();
        registry.GetKeys().Should().HaveCount(1);
    }
Exemple #7
0
 public DefaultMediatorClient(ServiceRegistry serviceRegistry, ListenerRegistry eventRegistry,
                              ServiceFactory serviceFactory, IScopedServiceFactoryFactory scopedServiceFactoryFactory,
                              IServiceLikeLogger logger)
 {
     _factory                     = serviceFactory ?? throw new ArgumentNullException(nameof(serviceFactory));;
     _serviceRegistry             = serviceRegistry ?? throw new ArgumentNullException(nameof(serviceRegistry));
     _listenerRegistry            = eventRegistry ?? throw new ArgumentNullException(nameof(eventRegistry));
     _scopedServiceFactoryFactory = scopedServiceFactoryFactory ?? throw new ArgumentNullException(nameof(scopedServiceFactoryFactory));
     _logger   = new ServiceLikeLoggerWrapper(logger);
     _mediator = new Mediator(serviceFactory);
 }
    public static IServiceCollection AddMediatRServiceLike(this IServiceCollection services, Assembly assembly, params Type[] filterTypes)
    {
        if (!(services.LastOrDefault(s => s.ServiceType == typeof(ServiceRegistry))?
              .ImplementationInstance is ServiceRegistry serviceRegistry))
        {
            serviceRegistry = new ServiceRegistry();
        }
        services.TryAddSingleton(serviceRegistry);

        var serviceDescriptions = assembly.GetTypes()
                                  .Where(MediatorServiceDescription.CanServicalize);

        foreach (var serviceDescription in serviceDescriptions)
        {
            serviceRegistry.Add(serviceDescription, true, filterTypes);
        }

        if (!(services.LastOrDefault(s => s.ServiceType == typeof(ListenerRegistry))?
              .ImplementationInstance is ListenerRegistry listenerRegistry))
        {
            listenerRegistry = new ListenerRegistry();
        }
        services.TryAddSingleton(listenerRegistry);

        var listenerDescriptions = assembly.GetTypes()
                                   .Where(MediatorListenerDescription.CanListenerize);

        foreach (var listenerDescription in listenerDescriptions)
        {
            listenerRegistry.Add(listenerDescription);
        }

        services.TryAddSingleton <IServiceLikeContextAccessor, ServiceLikeContextAccessor>();

        services.TryAddTransient(typeof(IMediatorClient), provider =>
        {
            var servRegistry   = provider.GetService <ServiceRegistry>();
            var lisRegistry    = provider.GetService <ListenerRegistry>();
            var serviceFactory = provider.GetService <ServiceFactory>();
            var scopedServiceFactoryFactory = new ScopedServiceFactoryFactory(provider.GetService <IServiceScopeFactory>());
            var serviceLikeLogger           = provider.GetService <IServiceLikeLogger>();

            return(new DefaultMediatorClient(
                       servRegistry,
                       lisRegistry,
                       serviceFactory,
                       scopedServiceFactoryFactory,
                       serviceLikeLogger));
        });

        return(services);
    }
Exemple #9
0
    public void AddMediatRServiceLike_EventRegistryが先に登録されている場合はそのインスタンスが利用される()
    {
        var services = new ServiceCollection();
        var registry = new ListenerRegistry();

        services.AddSingleton(registry);

        services.AddMediatRServiceLike(typeof(ServicePing).Assembly);
        var provider            = services.BuildServiceProvider();
        var registryFromService = provider.GetService <ListenerRegistry>();

        registryFromService.Should().BeSameAs(registry);
        registry.GetListeners("pang").Should().NotBeNull();
        registry.GetListeners("pang2").Should().NotBeNull();
    }
Exemple #10
0
    public void Add_AsEventが複数付与されている場合は複数追加される()
    {
        var registry = new ListenerRegistry();

        registry.Add(typeof(MultiPang));

        var ev1 = registry.GetListeners("pang.1");

        ev1.Should().NotBeNull();
        var ev2 = registry.GetListeners("pang.2");

        ev2.Should().NotBeNull();

        registry.GetKeys().Should().HaveCount(2);
    }
Exemple #11
0
    public void AddMediatRServiceLike_IMediatorClientはDefaultMediatorClientでIMediatorが無い方のコンストラクタが利用される()
    {
        var services        = new ServiceCollection();
        var serviceRegistry = new ServiceRegistry();

        services.AddSingleton(serviceRegistry);
        var listenerRegistry = new ListenerRegistry();

        services.AddSingleton(listenerRegistry);
        var serviceFactory = new ServiceFactory(_ => null);

        services.AddSingleton(serviceFactory);

        services.AddMediatRServiceLike(typeof(ServicePing).Assembly);

        var client = services.BuildServiceProvider().GetService <IMediatorClient>();

        client.Should().NotBeNull().And.BeOfType <DefaultMediatorClient>();
    }
Exemple #12
0
    public void Add_同じパスが登録された場合は両方とも保持される()
    {
        var registry = new ListenerRegistry();

        registry.Add(typeof(Pang));
        registry.Add(typeof(Pang2));

        registry.GetKeys().Should().HaveCount(1);
        var notifications = registry.GetListeners(registry.GetKeys().First());

        notifications.Should().HaveCount(2);
        var expectedList = new Queue <Type>(new[] { typeof(Pang), typeof(Pang2) });

        for (var i = 0; i < expectedList.Count; i++)
        {
            var expect = expectedList.Dequeue();
            notifications.Should().Contain(n => n.ListenerType == expect);
        }
    }
Exemple #13
0
    public async Task PublishAsync_Notification内で例外が発生しても続行される()
    {
        var services = new ServiceCollection();
        services.AddMediatR(typeof(ExceptionPang).Assembly);
        var provider = services.BuildServiceProvider();

        var serviceFactory = provider.GetService<ServiceFactory>();
        var registry = new ListenerRegistry();
        registry.Add(typeof(ExceptionPang));

        var logger = new TestLogger();

        var client = new DefaultMediatorClient(new ServiceRegistry(), registry,
            serviceFactory!, new InternalScopedServiceFactoryFactory(serviceFactory!), logger);
        await client.PublishAsync(nameof(ExceptionPang), new { });

        // Fire and forgetのため一旦スリープ
        Thread.Sleep(2000);

        logger.Errors.Should().HaveCount(1);
    }
Exemple #14
0
        public void RemoveEventListener <T>(uint id)
        {
            List <ListenerRegistry> list;

            System.Type key = typeof(T);
            this._evtListeners.TryGetValue(key, out list);
            if ((list != null) && (list.Count > 0))
            {
                for (int i = 0; i < list.Count; i++)
                {
                    ListenerRegistry item = list[i];
                    if (item.listenerID == id)
                    {
                        item.registerCount--;
                        if (item.registerCount == 0)
                        {
                            list.Remove(item);
                        }
                        return;
                    }
                }
            }
        }
Exemple #15
0
    public void GetNotifications_設定されていないパスが指定された場合はnullが返る()
    {
        var registry = new ListenerRegistry();

        registry.GetListeners("unknown.event").Should().BeEmpty();
    }