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); }
/// <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); }