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); }
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); }