public void Add_typeがnullの場合は例外が発生する() { var registry = new ListenerRegistry(); Action act = () => registry.Add(null); act.Should().Throw <ArgumentNullException>(); }
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); }
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); } }
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(); }
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)); } }
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); }
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); }
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(); }
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); }
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>(); }
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); } }
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); }
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; } } } }
public void GetNotifications_設定されていないパスが指定された場合はnullが返る() { var registry = new ListenerRegistry(); registry.GetListeners("unknown.event").Should().BeEmpty(); }