Exemple #1
0
        private static void AddDefaultServices(AddRemotiatrOptions options)
        {
            options.Services.TryAddSingleton <IMessageSerializer, DefaultJsonMessageSerializer>();

            options.Services.TryAddSingleton <IMessageTransport, DefaultHttpMessageTransport>();

            options.Services.TryAddSingleton <IKeyMessageTypeMappings, KeyMessageTypeMappings>();

            options.Services.AddMediatR(
                options.AssembliesToScan.ToArray(),
                x =>
            {
                switch (options.MediatorServiceLifetime)
                {
                case ServiceLifetime.Transient:
                    x.AsTransient();
                    break;

                case ServiceLifetime.Scoped:
                    x.AsScoped();
                    break;

                case ServiceLifetime.Singleton:
                    x.AsSingleton();
                    break;

                default:
                    throw new ArgumentOutOfRangeException(nameof(options.MediatorServiceLifetime), "Not a valid ServiceLifetime");
                }

                typeof(MediatRServiceConfiguration)
                .GetMethod(nameof(MediatRServiceConfiguration.Using))
                !.MakeGenericMethod(options.MediatorImplementationType)
                .Invoke(x, new object[0]);
            }
Exemple #2
0
        private static IServiceCollection AddRemotiatr <TMarker, TRemotiatr>(this IServiceCollection serviceCollection, Action <IAddRemotiatrOptions> configure)
            where TRemotiatr : IRemotiatr <TMarker>
        {
            if (serviceCollection == null)
            {
                throw new ArgumentNullException(nameof(serviceCollection));
            }
            if (configure == null)
            {
                throw new ArgumentNullException(nameof(configure));
            }

            var options = new AddRemotiatrOptions();

            configure.Invoke(options);

            if (options.EndpointUri == null)
            {
                throw new InvalidOperationException($"{nameof(options.EndpointUri)} is a required configuration and must be set using {nameof(IAddRemotiatrOptions.SetEndpointUri)}.");
            }

            AddDefaultServices(options);

            var notificationTypes = RegisterNotificationHandlers(
                options.AssembliesToScan,
                options.EndpointUri,
                options.Services
                ).ToArray();

            var notificationTypesLookup = ImmutableHashSet.Create(notificationTypes);

            var requestTypes = RegisterRequestHandlers(
                options.AssembliesToScan,
                options.EndpointUri,
                options.Services
                ).ToArray();

            var requestTypesLookup = ImmutableHashSet.Create(requestTypes);

            var responseTypes = requestTypes
                                .Select(x => x.GetResponseType())
                                .ToArray();

            var keyMessageTypeMappings = notificationTypes.Concat(requestTypes).Concat(responseTypes)
                                         .Distinct()
                                         .Select(x => new KeyMessageTypeMapping(options.MessageKeyGenerator(x), x))
                                         .ToArray();

            foreach (var keyMessageTypeMapping in keyMessageTypeMappings)
            {
                options.Services.AddSingleton(keyMessageTypeMapping);
            }

            var internalServiceProvider = options.Services.BuildServiceProvider();

            serviceCollection.RemoveAll <IRemotiatr <TMarker> >();

            if (typeof(TMarker) == typeof(IDefaultRemotiatrMarker))
            {
                serviceCollection.RemoveAll <IRemotiatr>();

                serviceCollection.AddSingleton <IRemotiatr>(x => new DefaultRemotiatr(internalServiceProvider, notificationTypesLookup, requestTypesLookup));
                serviceCollection.AddSingleton(x => (IRemotiatr <TMarker>)x.GetRequiredService <IRemotiatr>());
            }
            else
            {
                serviceCollection.AddSingleton <IRemotiatr <TMarker> >(x => new Remotiatr <TMarker>(internalServiceProvider, notificationTypesLookup, requestTypesLookup));
            }

            return(serviceCollection);
        }