public ICqrsCommandHandlerSelector ByAttribute(ServiceLifetime lifetime, params Assembly[] assemblies)
        {
            if (assemblies == null)
            {
                throw new ArgumentNullException(nameof(assemblies));
            }

            if (assemblies.Length == 0)
            {
                throw new ArgumentException("No command handler assemblies were provided.", nameof(assemblies));
            }

            _serviceCollection.Scan(scan => scan
                                    // Scan distinct assemblies.
                                    .FromAssemblies(assemblies.Distinct())
                                    // Register classes that has a method marked with [CommandHandler]
                                    .AddClasses(classes => classes.Where(type => CommandHandlerAttributeMethod.IsFoundInType(type)))
                                    .AsSelf()
                                    .WithLifetime(lifetime));

            _serviceCollection.AddSingleton <CommandHandlerDelegateResolver>(serviceProvider =>
            {
                var singleMessageHandlerRegistration = new SingleMessageHandlerRegistration();
                singleMessageHandlerRegistration.RegisterCommandHandlersByAttribute(assemblies, serviceProvider.GetRequiredService);

                return(new CommandHandlerDelegateResolver(singleMessageHandlerRegistration.BuildMessageHandlerResolver()));
            });

            return(this);
        }
Exemplo n.º 2
0
        public ICqrsCommandHandlerSelector ByAttribute(Lifestyle lifeStyle, params Assembly[] assemblies)
        {
            if (lifeStyle == null)
            {
                throw new ArgumentNullException(nameof(lifeStyle));
            }

            if (assemblies == null)
            {
                throw new ArgumentNullException(nameof(assemblies));
            }

            if (assemblies.Length == 0)
            {
                throw new ArgumentException("No command handler assemblies were provided.", nameof(assemblies));
            }

            // Get all types that has methods marked with [CommandHandler] attribute from distinct assemblies.
            IEnumerable <Type> foundTypes = assemblies.Distinct()
                                            .SelectMany(assembly => assembly.GetTypes())
                                            .Where(type => type.IsClass &&
                                                   !type.IsAbstract &&
                                                   CommandHandlerAttributeMethod.IsFoundInType(type))
                                            .ToArray();

            if (!foundTypes.Any())
            {
                return(this);
            }

            foreach (Type type in foundTypes)
            {
                // Register type as self.
                _container.Register(type, type, lifeStyle);
            }

            var singleMessageHandlerRegistration = new SingleMessageHandlerRegistration();

            singleMessageHandlerRegistration.RegisterCommandHandlersByAttribute(foundTypes, _container.GetInstance);

            // Register resolver.
            _container.Collections.AppendTo(
                typeof(CommandHandlerDelegateResolver),
                Lifestyle.Singleton.CreateRegistration(() =>
                                                       new CommandHandlerDelegateResolver(singleMessageHandlerRegistration.BuildMessageHandlerResolver()),
                                                       _container
                                                       )
                );

            return(this);
        }
        public ICqrsCommandHandlerSelector ByAttribute(Lifetime lifetime, params Assembly[] assemblies)
        {
            if (assemblies == null)
            {
                throw new ArgumentNullException(nameof(assemblies));
            }

            if (assemblies.Length == 0)
            {
                throw new ArgumentException("No command handler assemblies were provided.", nameof(assemblies));
            }

            Assembly[] distinctAssemblies = assemblies.Distinct().ToArray();

            var handlerRegistration = _builder.RegisterAssemblyTypes(distinctAssemblies)
                                      .Where(type => type.IsClass && !type.IsAbstract &&
                                             CommandHandlerAttributeMethod.IsFoundInType(type))
                                      .AsSelf();

            // Update registration if lifetime is not PerDependency.
            switch (lifetime)
            {
            case Lifetime.PerLifetimeScope:
            {
                handlerRegistration.InstancePerLifetimeScope();
            }
            break;

            case Lifetime.Singleton:
            {
                handlerRegistration.SingleInstance();
            }
            break;
            }

            _builder.Register(context =>
            {
                var c = context.Resolve <IComponentContext>();
                var singleMessageHandlerRegistration = new SingleMessageHandlerRegistration();
                singleMessageHandlerRegistration.RegisterCommandHandlersByAttribute(distinctAssemblies, c.Resolve);
                return(new CommandHandlerDelegateResolver(singleMessageHandlerRegistration.BuildMessageHandlerResolver()));
            }).AsSelf().SingleInstance();

            return(this);
        }