コード例 #1
0
ファイル: Service.cs プロジェクト: dsomok/Rattle
        private void RegisterHandlersInInvoker()
        {
            foreach (var handlersAssembly in HandlersAssemblies)
            {
                var handlers = (from type in handlersAssembly.GetTypes()
                                from typeInterface in type.GetInterfaces()
                                where typeInterface.IsGenericType
                                let genericDefinition = typeInterface.GetGenericTypeDefinition()
                                                        where genericDefinition == typeof(ICommandHandler <>) ||
                                                        genericDefinition == typeof(IRequestHandler <>) ||
                                                        genericDefinition == typeof(IEventHandler <>)
                                                        select typeInterface).ToList();

                foreach (var handler in handlers)
                {
                    var actionType  = handler.GetGenericArguments();
                    var handlerType = handler.GetGenericTypeDefinition();

                    var registerHandlerMethod = (from method in m_handlerInvoker.GetType().GetMethods()
                                                 where method.IsGenericMethod &&
                                                 method.Name == "RegisterHandler"
                                                 let methodParams = method.GetParameters()
                                                                    where methodParams.Length == 1
                                                                    let methodParam = methodParams[0]
                                                                                      where methodParam.ParameterType.Name == handlerType.Name &&
                                                                                      methodParam.ParameterType.Assembly == handlerType.Assembly
                                                                                      let genericMethod = method.MakeGenericMethod(actionType)
                                                                                                          select genericMethod).Single();

                    registerHandlerMethod.Invoke(m_handlerInvoker, new[] { m_container.Resolve(handler) });
                }
            }
        }