示例#1
0
        private void RegHandlerType()
        {
            var registrar = ServicesCollection.BuildServiceProvider().GetService <IHandlerRegistrar>();

            var registerExecutorMethod = registrar
                                         .GetType()
                                         .GetMethods(BindingFlags.Instance | BindingFlags.Public)
                                         .Where(mi => mi.Name == "RegisterHandler")
                                         .Where(mi => mi.IsGenericMethod)
                                         .Where(mi => mi.GetGenericArguments().Length == 1)
                                         .Single(mi => mi.GetParameters().Length == 1);

            var executorTypes = TypeDict.Values
                                .Select(t => new
            {
                Type       = t,
                Interfaces = t.GetInterfaces()
                             .Where(i => i.GetTypeInfo().IsGenericType&& (i.GetGenericTypeDefinition() == typeof(ICommandHandler <>) ||
                                                                          i.GetGenericTypeDefinition() ==
                                                                          typeof(IEventHandler <>)))
            })
                                .Where(e => e.Interfaces != null && e.Interfaces.Any());

            foreach (var executorType in executorTypes)
            {
                ServicesCollection.AddTransient(executorType.Type);

                foreach (var @interface in executorType.Interfaces)
                {
                    var commandType = @interface.GetGenericArguments()[0];
                    registerExecutorMethod.MakeGenericMethod(commandType)
                    .Invoke(registrar,
                            new object[] { new Func <dynamic, Task>(x =>
                        {
                            dynamic handler = ServicesCollection.BuildServiceProvider().GetService(executorType.Type);
                            return(handler.Handle(x));
                        }) }
                            );
                }
            }
        }