Пример #1
0
        public Object UseService(Type type)
        {
            PHPRPC_InvocationHandler handler = new PHPRPC_InvocationHandler(this);

            if (type.IsInterface)
            {
                return(DynamicProxy.NewInstance(AppDomain.CurrentDomain, new Type[] { type }, handler));
            }
            else
            {
                return(DynamicProxy.NewInstance(AppDomain.CurrentDomain, type.GetInterfaces(), handler));
            }
        }
Пример #2
0
        public static TInterface CreateMock <TInterface>(bool autoRegisterToContainer = false) where TInterface : class
        {
            TInterface mock = DynamicProxy.NewInstance <TInterface>(new IInterceptor[] { new MockerInterceptor() }, new Type[] { typeof(IMockObject) }) as TInterface;

            // Verifica se o mock deve ser registrado no container de injeção de dependencia.
            if (autoRegisterToContainer == true)
            {
                IocFactory.Register(
                    Component.For <TInterface>().Instance(mock)
                    );
            }

            return(mock);
        }
Пример #3
0
        public Object UseService(Type[] interfaces)
        {
            PHPRPC_InvocationHandler handler = new PHPRPC_InvocationHandler(this);

            return(DynamicProxy.NewInstance(AppDomain.CurrentDomain, interfaces, handler));
        }
Пример #4
0
        //private static object CreateInstance(Type interfaceType, ComponentData componentData, IEnumerable<Type> interceptorCollection, params object[] constructorParameters) {
        private static object CreateInstance(Type interfaceType, ComponentData componentData, IRegistrationInfo registrationInfo, params object[] constructorParameters)
        {
            // Obtém o primeiro tipo concreto registrado para ser instanciado.
            Type concreteType = componentData.ConcreteType;

            // Obtém os construtores públicos da classe concreta.
            ConstructorInfo[] constructorInfoCollection = concreteType.GetConstructors();

            // Verifica se existe um construtor padrão (sem parâmetros).
            bool hasDefaultContructor = constructorInfoCollection.Any(p => p.GetParameters().Length == 0);

            List <object> interceptors = new List <object>();

            if (registrationInfo != null && registrationInfo.InterceptorCollection.Any() == true)
            {
                foreach (Type interceptor in registrationInfo.InterceptorCollection)
                {
                    // Cria uma instancia do interceptor.
                    object interceptorInstance = Activator.CreateInstance(interceptor);

                    interceptors.Add(interceptorInstance);
                }
            }

            // Caso exista um construtor padrão e nenhum parâmetro tenha sido especificado, cria a instancia.
            if (hasDefaultContructor == true && constructorParameters.Length == 0)
            {
                // Cria e retorna uma nova instancia do tipo concreto com o construtor padrão.
                object instance = CreateInstance(registrationInfo, concreteType);

                // Caso algum interceptor tenha sido especificado, utiliza um proxy.
                return((registrationInfo.InterceptorCollection.Any() == false) ? instance : DynamicProxy.NewInstance(instance, interceptors.OfType <IInterceptor>().ToArray()));
            }

            // Caso não exista um construtor padrão, ou algum parâmetro tenha sido especificado.
            if (constructorParameters.Length > 0)
            {
                // Armazena a lista de tipos dos parâmetros do construtor.
                IEnumerable <Type> constructorParameterTypeCollection = constructorParameters.Select(p => p.GetType());

                // Analisa todos os construtores disponíveis.
                foreach (ConstructorInfo constructorInfo in constructorInfoCollection)
                {
                    // Obtém os parâmetros do construtor.
                    ParameterInfo[] parameterInfoCollection = constructorInfo.GetParameters();

                    // Caso o construtor não possua a mesma quantidade de parâmetros que foram informados, passa para o próximo construtor.
                    if (constructorParameterTypeCollection.Count() != parameterInfoCollection.Count())
                    {
                        continue;
                    }

                    // Obtém a lista de tipos dos parâmetros.
                    IEnumerable <Type> parameterTypeCollection = parameterInfoCollection.Select(p => p.ParameterType);

                    IList <Type> matchedParameterList = new List <Type>();

                    int parameterCounter = 0;

                    // Percorre a lista de parâmetros encontrados no construtor.
                    foreach (Type parameterType in parameterTypeCollection)
                    {
                        // Percorre a lista de parâmetros informados para instanciar o tipo.
                        do
                        {
                            Type constructorParameterType = constructorParameterTypeCollection.ElementAt(parameterCounter);

                            parameterCounter++;

                            if (constructorParameterType == parameterType || (parameterType.IsInterface && parameterType.IsAssignableFrom(constructorParameterType) == true) || constructorParameterType.BaseType == parameterType)
                            {
                                matchedParameterList.Add(constructorParameterType);
                                break;
                            }
                        } while (parameterCounter < constructorParameterTypeCollection.Count());
                    }

                    // Caso as assinaturas dos parâmetros e do construtor sejam identicas, utiliza o construtor atual.
                    if (matchedParameterList.Count == parameterTypeCollection.Count())
                    {
                        object instance = CreateInstance(registrationInfo, concreteType, constructorParameters);

                        // Caso algum interceptor tenha sido especificado, utiliza um proxy.
                        return((registrationInfo.InterceptorCollection.Any() == false) ? instance : DynamicProxy.NewInstance(instance, interceptors.OfType <IInterceptor>().ToArray()));
                    }
                }
            }

            IList <object> parameters = new List <object>();

            // Analisa todos os construtores disponíveis.
            foreach (ConstructorInfo constructorInfo in constructorInfoCollection)
            {
                // Obtém os parâmetros do construtor.
                ParameterInfo[] parameterInfoCollection = constructorInfo.GetParameters();

                // Verifica cada parâmetro do construtor.
                foreach (ParameterInfo parameterInfo in parameterInfoCollection)
                {
                    Type parameterType = parameterInfo.ParameterType;

                    // Verifica se não é um tipo base do .NET.
                    if (parameterType.FullName.StartsWith("System.") == false)
                    {
                        // Tenta localizar alguma interface registrada que seja do mesmo tipo do construtor.
                        IRegistrationInfo parameterRegistrationInfo = RegistrationInfoCollection.FirstOrDefault(p => p.InterfaceType.IsAssignableFrom(parameterType) == true);

                        // Caso nenhum tipo tenha sido encontrado, passa para o próximo parâmetro.
                        if (parameterRegistrationInfo == null)
                        {
                            continue;
                        }

                        ComponentData dependencyData = parameterRegistrationInfo.ComponentDataCollection.FirstOrDefault(p => p.ConcreteType != null && (p.ConcreteType == parameterType || parameterType.IsAssignableFrom(p.ConcreteType)));

                        if (dependencyData == null)
                        {
                            continue;
                        }

                        // Adiciona uma instancia do tipo encontrado na lista de parâmetros do construtor.
                        parameters.Add(CreateInstance(interfaceType, dependencyData, registrationInfo));
                    }
                }

                // Verifica se a quantidade de parâmetros esta de acordo com a quantidade de objetos disponíveis.
                if (parameters.Count == parameterInfoCollection.Length)
                {
                    object instance = CreateInstance(registrationInfo, concreteType, parameters.ToArray());

                    // Caso algum interceptor tenha sido especificado, utiliza um proxy.
                    return((registrationInfo.InterceptorCollection.Any() == false) ? instance : DynamicProxy.NewInstance(instance, interceptors.OfType <IInterceptor>().ToArray()));
                }
            }

            throw new InvalidOperationException("Could not find any constructor matching the specified parameters.");
        }