private static void PopulateMetaInfoFromType(TransactionMetaInfo metaInfo, Type implementation)
		{
			if (implementation == typeof(object) || implementation == typeof(MarshalByRefObject)) return;

			MethodInfo[] methods = implementation.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);

			foreach (MethodInfo method in methods)
			{
				object[] atts = method.GetCustomAttributes(typeof(TransactionAttribute), true);

				if (atts.Length != 0)
				{
					metaInfo.Add(method, atts[0] as TransactionAttribute);
					// only add the method as transaction injection if we also have specified a transaction attribute.
					atts = method.GetCustomAttributes(typeof (InjectTransactionAttribute), true);

					if (atts.Length != 0)
					{
						metaInfo.AddInjection(method);
					}
				}
			}

			PopulateMetaInfoFromType(metaInfo, implementation.BaseType);
		}
        private static void PopulateMetaInfoFromType(TransactionMetaInfo metaInfo, Type implementation)
        {
            if (implementation == typeof(object) || implementation == typeof(MarshalByRefObject))
            {
                return;
            }

            MethodInfo[] methods = implementation.GetMethods(BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.DeclaredOnly);

            foreach (MethodInfo method in methods)
            {
                object[] atts = method.GetCustomAttributes(typeof(TransactionAttribute), true);

                if (atts.Length != 0)
                {
                    metaInfo.Add(method, atts[0] as TransactionAttribute);
                    // only add the method as transaction injection if we also have specified a transaction attribute.
                    atts = method.GetCustomAttributes(typeof(InjectTransactionAttribute), true);

                    if (atts.Length != 0)
                    {
                        metaInfo.AddInjection(method);
                    }
                }
            }

            PopulateMetaInfoFromType(metaInfo, implementation.BaseType);
        }
		///<summary>
		/// Creates meta-information from a type.
		///</summary>
		public TransactionMetaInfo CreateMetaFromType(Type implementation)
		{
			TransactionMetaInfo metaInfo = new TransactionMetaInfo();

			PopulateMetaInfoFromType(metaInfo, implementation);

			Register(implementation, metaInfo);

			return metaInfo;
		}
        ///<summary>
        /// Creates meta-information from a type.
        ///</summary>
        public TransactionMetaInfo CreateMetaFromType(Type implementation)
        {
            TransactionMetaInfo metaInfo = new TransactionMetaInfo();

            PopulateMetaInfoFromType(metaInfo, implementation);

            Register(implementation, metaInfo);

            return(metaInfo);
        }
Example #5
0
        /// <summary>
        /// Associates the transaction interceptor with the ComponentModel.
        /// </summary>
        /// <param name="model">The model.</param>
        /// <param name="store">The meta information store.</param>
        private void AddTransactionInterceptorIfIsTransactional(ComponentModel model,
                                                                TransactionMetaInfoStore store)
        {
            TransactionMetaInfo meta = store.GetMetaFor(model.Implementation);

            if (meta == null)
            {
                return;
            }

            model.Dependencies.Add(
                new DependencyModel(this.ObtainNodeName(), typeof(TransactionInterceptor), false));

            model.Interceptors.AddFirst(new InterceptorReference(typeof(TransactionInterceptor)));
        }
        /// <summary>
        /// Associates the transaction interceptor with the ComponentModel.
        /// </summary>
        /// <param name="model">The model.</param>
        /// <param name="store">The meta information store.</param>
        private static void AddTransactionInterceptorIfIsTransactional(ComponentModel model,
                                                                       TransactionMetaInfoStore store)
        {
            TransactionMetaInfo meta = store.GetMetaFor(model.Implementation);

            if (meta == null)
            {
                return;
            }

            model.Dependencies.Add(
                new DependencyModel(null, typeof(TransactionInterceptor), false));

            //model.Interceptors.AddFirst(new InterceptorReference(typeof(TransactionInterceptor)));
            model.Interceptors.AddFirst(new InterceptorReference("transaction.interceptor"));//必须声明此名称,否则注册此拦截器时不可Named()
        }
        /// <summary>
        /// Validates the type is OK to generate a proxy.
        /// </summary>
        /// <param name="model">The model.</param>
        /// <param name="store">The store.</param>
        private void Validate(ComponentModel model, TransactionMetaInfoStore store)
        {
            //HACK:model.Service->model.Services
            if (model.Services.Count() == 0 || model.Services.All(o => o.IsInterface))
            {
                return;
            }

            TransactionMetaInfo meta = store.GetMetaFor(model.Implementation);

            if (meta == null)
            {
                return;
            }

            ArrayList problematicMethods = new ArrayList();

            foreach (MethodInfo method in meta.Methods)
            {
                if (!method.IsVirtual)
                {
                    problematicMethods.Add(method.Name);
                }
            }

            if (problematicMethods.Count != 0)
            {
                String[] methodNames = (String[])problematicMethods.ToArray(typeof(String));

                String message = String.Format("The class {0} wants to use transaction interception, " +
                                               "however the methods must be marked as virtual in order to do so. Please correct " +
                                               "the following methods: {1}", model.Implementation.FullName,
                                               String.Join(", ", methodNames));

                throw new FacilityException(message);
            }
        }
        ///<summary>
        /// Create meta-information from the configuration about
        /// what methods should be overridden.
        ///</summary>
        public TransactionMetaInfo CreateMetaFromConfig(Type implementation, IList <MethodInfo> methods, IConfiguration config)
        {
            TransactionMetaInfo metaInfo = GetMetaFor(implementation);

            if (metaInfo == null)
            {
                metaInfo = new TransactionMetaInfo();
            }

            foreach (MethodInfo method in methods)
            {
                String transactionMode = config.Attributes[TransactionModeAtt];
                String isolationLevel  = config.Attributes[IsolationModeAtt];

                TransactionMode mode  = ObtainTransactionMode(implementation, method, transactionMode);
                IsolationMode   level = ObtainIsolation(implementation, method, isolationLevel);

                metaInfo.Add(method, new TransactionAttribute(mode, level));
            }

            Register(implementation, metaInfo);

            return(metaInfo);
        }
        ///<summary>
        /// Create meta-information from the configuration about
        /// what methods should be overridden.
        ///</summary>
        public TransactionMetaInfo CreateMetaFromConfig(Type implementation, IList<MethodInfo> methods, IConfiguration config)
        {
            TransactionMetaInfo metaInfo = GetMetaFor(implementation);

            if (metaInfo == null)
            {
                metaInfo = new TransactionMetaInfo();
            }

            foreach (MethodInfo method in methods)
            {
                String transactionMode = config.Attributes[TransactionModeAtt];
                String isolationLevel = config.Attributes[IsolationModeAtt];

                TransactionMode mode = ObtainTransactionMode(implementation, method, transactionMode);
                IsolationMode level = ObtainIsolation(implementation, method, isolationLevel);

                metaInfo.Add(method, new TransactionAttribute(mode, level));
            }

            Register(implementation, metaInfo);

            return metaInfo;
        }
		private void Register(Type implementation, TransactionMetaInfo metaInfo)
		{
			type2MetaInfo[implementation] = metaInfo;
		}
		/// <summary>
		/// Sets the intercepted component's ComponentModel.
		/// </summary>
		/// <param name="target">The target's ComponentModel</param>
		public void SetInterceptedComponentModel(ComponentModel target)
		{
			metaInfo = infoStore.GetMetaFor(target.Implementation);
		}
 private void Register(Type implementation, TransactionMetaInfo metaInfo)
 {
     type2MetaInfo[implementation] = metaInfo;
 }
Example #13
0
 /// <summary>
 /// Sets the intercepted component's ComponentModel.
 /// </summary>
 /// <param name="target">The target's ComponentModel</param>
 public void SetInterceptedComponentModel(ComponentModel target)
 {
     metaInfo = infoStore.GetMetaFor(target.Implementation);
 }