public void ProxyTransparentProxy()
        {
            DefaultListableObjectFactory of = new DefaultListableObjectFactory();

            ConstructorArgumentValues ctorArgs = new ConstructorArgumentValues();

            ctorArgs.AddNamedArgumentValue("objectType", typeof(ITestObject));
            of.RegisterObjectDefinition("bar", new RootObjectDefinition(typeof(TransparentProxyFactory), ctorArgs, null));

            TestAutoProxyCreator apc = new TestAutoProxyCreator(of);

            of.AddObjectPostProcessor(apc);

            ITestObject o = of.GetObject("bar") as ITestObject;

            Assert.IsTrue(AopUtils.IsAopProxy(o));

            // ensure interceptors get called
            o.Foo();
            Assert.AreEqual(1, apc.NopInterceptor.Count);
            IAdvised advised = (IAdvised)o;

            // ensure target was called
            object target = advised.TargetSource.GetTarget();

            Assert.AreEqual(1, TransparentProxyFactory.GetRealProxy(target).Count);
        }
예제 #2
0
        IObjectDefinition IObjectDefinitionParser.ParseElement(XmlElement element, ParserContext parserContext)
        {
            AssertUtils.ArgumentNotNull(parserContext, "parserContext");

            string id          = element.GetAttribute(ObjectDefinitionConstants.IdAttribute);
            string hostBaseUri = element.GetAttribute(HostBaseUriAttribute);
            string timeout     = element.GetAttribute(TimeOutAttribute);

            if (hostBaseUri.IsNullOrEmpty())
            {
                Console.WriteLine("创建Rest客户端实例异常:没有填写hostBaseUri配置");
                Exception ex = new Exception("创建Rest客户端实例异常:没有填写hostBaseUri配置");
                throw ex;
            }
            ConstructorArgumentValues cav = new ConstructorArgumentValues();

            cav.AddNamedArgumentValue("baseUrl", hostBaseUri);
            MutablePropertyValues mpv = new MutablePropertyValues();

            mpv.Add("TimeOut", timeout);
            RootObjectDefinition rod = new RootObjectDefinition(typeof(RestClient), cav, mpv);

            parserContext.Registry.RegisterObjectDefinition(id, rod);
            return(null);
        }
예제 #3
0
        /// <summary>
        /// Resolves the <see cref="Spring.Objects.Factory.Config.ConstructorArgumentValues"/>
        /// of the supplied <paramref name="definition"/>.
        /// </summary>
        /// <param name="objectName">The name of the object that is being resolved by this factory.</param>
        /// <param name="definition">The rod.</param>
        /// <param name="wrapper">The wrapper.</param>
        /// <param name="cargs">The cargs.</param>
        /// <param name="resolvedValues">Where the resolved constructor arguments will be placed.</param>
        /// <returns>
        /// The minimum number of arguments that any constructor for the supplied
        /// <paramref name="definition"/> must have.
        /// </returns>
        /// <remarks>
        ///     <p>
        /// 'Resolve' can be taken to mean that all of the <paramref name="definition"/>s
        /// constructor arguments is resolved into a concrete object that can be plugged
        /// into one of the <paramref name="definition"/>s constructors. Runtime object
        /// references to other objects in this (or a parent) factory are resolved,
        /// type conversion is performed, etc.
        /// </p>
        ///     <p>
        /// These resolved values are plugged into the supplied
        /// <paramref name="resolvedValues"/> object, because we wouldn't want to touch
        /// the <paramref name="definition"/>s constructor arguments in case it (or any of
        /// its constructor arguments) is a prototype object definition.
        /// </p>
        ///     <p>
        /// This method is also used for handling invocations of static factory methods.
        /// </p>
        /// </remarks>
        private int ResolveConstructorArguments(string objectName, RootObjectDefinition definition, ObjectWrapper wrapper,
                                                ConstructorArgumentValues cargs,
                                                ConstructorArgumentValues resolvedValues)
        {
//            ObjectDefinitionValueResolver valueResolver = new ObjectDefinitionValueResolver(objectFactory);
            int minNrOfArgs = cargs.ArgumentCount;

            foreach (DictionaryEntry entry in cargs.IndexedArgumentValues)
            {
                int index = Convert.ToInt32(entry.Key);
                if (index < 0)
                {
                    throw new ObjectCreationException(definition.ResourceDescription, objectName,
                                                      "Invalid constructor agrument index: " + index);
                }
                if (index > minNrOfArgs)
                {
                    minNrOfArgs = index + 1;
                }
                ConstructorArgumentValues.ValueHolder valueHolder =
                    (ConstructorArgumentValues.ValueHolder)entry.Value;
                string argName       = "constructor argument with index " + index;
                object resolvedValue =
                    valueResolver.ResolveValueIfNecessary(objectName, definition, argName, valueHolder.Value);
                resolvedValues.AddIndexedArgumentValue(index, resolvedValue,
                                                       StringUtils.HasText(valueHolder.Type)
                                                           ? TypeResolutionUtils.ResolveType(valueHolder.Type).
                                                       AssemblyQualifiedName
                                                           : null);
            }

            foreach (ConstructorArgumentValues.ValueHolder valueHolder in definition.ConstructorArgumentValues.GenericArgumentValues)
            {
                string argName       = "constructor argument";
                object resolvedValue =
                    valueResolver.ResolveValueIfNecessary(objectName, definition, argName, valueHolder.Value);
                resolvedValues.AddGenericArgumentValue(resolvedValue,
                                                       StringUtils.HasText(valueHolder.Type)
                                                           ? TypeResolutionUtils.ResolveType(valueHolder.Type).
                                                       AssemblyQualifiedName
                                                           : null);
            }
            foreach (DictionaryEntry namedArgumentEntry in definition.ConstructorArgumentValues.NamedArgumentValues)
            {
                string argumentName          = (string)namedArgumentEntry.Key;
                string syntheticArgumentName = "constructor argument with name " + argumentName;
                ConstructorArgumentValues.ValueHolder valueHolder =
                    (ConstructorArgumentValues.ValueHolder)namedArgumentEntry.Value;
                object resolvedValue =
                    valueResolver.ResolveValueIfNecessary(objectName, definition, syntheticArgumentName, valueHolder.Value);
                resolvedValues.AddNamedArgumentValue(argumentName, resolvedValue);
            }
            return(minNrOfArgs);
        }
예제 #4
0
        /// <summary>
        /// Resolves the <see cref="Spring.Objects.Factory.Config.ConstructorArgumentValues"/>
        /// of the supplied <paramref name="definition"/>.
        /// </summary>
        /// <param name="objectName">The name of the object that is being resolved by this factory.</param>
        /// <param name="definition">The rod.</param>
        /// <param name="wrapper">The wrapper.</param>
        /// <param name="cargs">The cargs.</param>
        /// <param name="resolvedValues">Where the resolved constructor arguments will be placed.</param>
        /// <returns>
        /// The minimum number of arguments that any constructor for the supplied
        /// <paramref name="definition"/> must have.
        /// </returns>
        /// <remarks>
        ///     <p>
        /// 'Resolve' can be taken to mean that all of the <paramref name="definition"/>s
        /// constructor arguments is resolved into a concrete object that can be plugged
        /// into one of the <paramref name="definition"/>s constructors. Runtime object
        /// references to other objects in this (or a parent) factory are resolved,
        /// type conversion is performed, etc.
        /// </p>
        ///     <p>
        /// These resolved values are plugged into the supplied
        /// <paramref name="resolvedValues"/> object, because we wouldn't want to touch
        /// the <paramref name="definition"/>s constructor arguments in case it (or any of
        /// its constructor arguments) is a prototype object definition.
        /// </p>
        ///     <p>
        /// This method is also used for handling invocations of static factory methods.
        /// </p>
        /// </remarks>
        private int ResolveConstructorArguments(string objectName, RootObjectDefinition definition, ObjectWrapper wrapper,
                                                ConstructorArgumentValues cargs,
                                                ConstructorArgumentValues resolvedValues)
        {
//            ObjectDefinitionValueResolver valueResolver = new ObjectDefinitionValueResolver(objectFactory);
            int minNrOfArgs = cargs.ArgumentCount;

            if (cargs._indexedArgumentValues != null)
            {
                foreach (var entry in cargs._indexedArgumentValues)
                {
                    int index = entry.Key;
                    if (index < 0)
                    {
                        throw new ObjectCreationException(
                                  definition.ResourceDescription,
                                  objectName,
                                  $"Invalid constructor argument index: {index}");
                    }

                    if (index > minNrOfArgs)
                    {
                        minNrOfArgs = index + 1;
                    }

                    ConstructorArgumentValues.ValueHolder valueHolder = entry.Value;
                    string argName       = "constructor argument with index " + index;
                    object resolvedValue = valueResolver.ResolveValueIfNecessary(objectName, definition, argName, valueHolder.Value);
                    resolvedValues.AddIndexedArgumentValue(index, resolvedValue,
                                                           StringUtils.HasText(valueHolder.Type)
                            ? TypeResolutionUtils.ResolveType(valueHolder.Type).AssemblyQualifiedName
                            : null);
                }
            }

            if (definition.ConstructorArgumentValues._genericArgumentValues != null)
            {
                const string argName = "constructor argument";
                for (var i = 0; i < definition.ConstructorArgumentValues._genericArgumentValues.Count; i++)
                {
                    var    valueHolder   = definition.ConstructorArgumentValues._genericArgumentValues[i];
                    object resolvedValue = valueResolver.ResolveValueIfNecessary(objectName, definition, argName, valueHolder.Value);

                    resolvedValues.AddGenericArgumentValue(
                        resolvedValue,
                        StringUtils.HasText(valueHolder.Type)
                            ? TypeResolutionUtils.ResolveType(valueHolder.Type).AssemblyQualifiedName
                            : null);
                }
            }

            if (definition.ConstructorArgumentValues._namedArgumentValues != null)
            {
                foreach (var entry in definition.ConstructorArgumentValues._namedArgumentValues)
                {
                    string argumentName          = entry.Key;
                    string syntheticArgumentName = "constructor argument with name " + argumentName;
                    ConstructorArgumentValues.ValueHolder valueHolder = entry.Value;
                    object resolvedValue = valueResolver.ResolveValueIfNecessary(objectName, definition, syntheticArgumentName, valueHolder.Value);
                    resolvedValues.AddNamedArgumentValue(argumentName, resolvedValue);
                }
            }

            return(minNrOfArgs);
        }