예제 #1
0
        /// <summary>
        /// 创建一个代理类型。
        /// </summary>
        /// <param name="type">要注入AOP的类型。</param>
        /// <param name="option"></param>
        /// <returns>代理类。</returns>
        public static Type BuildType(Type type, InterceptBuildOption option = null)
        {
            Guard.ArgumentNull(type, nameof(type));
            if (type.IsSealed)
            {
                throw new AspectException(SR.GetString(SRKind.AopCanotCreateProxy_Sealed, type.FullName));
            }

            var members = GetInterceptMembers(type, type.IsDefined <InterceptAttribute>(true));

            //如果没有任何成员使用拦截器特性,则返回原来的类型
            if (members.IsNullOrEmpty())
            {
                return(type);
            }

            var typeName = string.Format(option == null || string.IsNullOrEmpty(option.TypeNameFormatter)
                ? "<Aspect>_{0}" : option.TypeNameFormatter, type.Name);

            var assemblyBuilder = option != null && option.AssemblyBuilder != null ? option.AssemblyBuilder :
#if OUT
                                  new DynamicAssemblyBuilder(AOP_PREFIX + type.Assembly.FullName, "c:\\test\\aoptest.dll");
#else
                                  new DynamicAssemblyBuilder(AOP_PREFIX + type.Assembly.FullName);
#endif

            if (option != null && option.AssemblyInitializer != null)
            {
                option.AssemblyInitializer(assemblyBuilder);
            }

            var builder = assemblyBuilder.DefineType(typeName);
            if (type.IsInterface)
            {
                builder.ImplementInterface(type);
            }
            else
            {
                builder.BaseType = type;
            }

            builder.ImplementInterface(typeof(IAopImplement));

            if (option != null && option.TypeInitializer != null)
            {
                option.TypeInitializer(builder);
            }

            var interceptMethod  = DefineInterceptMethod(builder);
            var globalIntercepts = type.GetCustomAttributes <InterceptAttribute>(true).ToList();

            DefineConstructors(builder, globalIntercepts);

            FindAndInjectMethods(builder, members, globalIntercepts, interceptMethod);
            FindAndInjectProperties(builder, members, globalIntercepts, interceptMethod);

            try
            {
#if OUT
                var proxyType = builder.CreateType();
                assemblyBuilder.Save();
                return(proxyType);
#else
                return(builder.CreateType());
#endif
            }
            catch (Exception exp)
            {
                throw new AspectException(SR.GetString(SRKind.AopCanotCreateProxy, type.FullName), exp);
            }
        }
예제 #2
0
        /// <summary>
        /// 创建一个代理类型。
        /// </summary>
        /// <param name="type">要注入AOP的类型。</param>
        /// <param name="option"></param>
        /// <returns>代理类。</returns>
        public static Type BuildTypeCached(Type type, InterceptBuildOption option = null)
        {
            var cacheMgr = Caching.CacheManagerFactory.CreateManager();

            return(cacheMgr.TryGet("Aspect_" + type.FullName, () => BuildType(type, option)));
        }
예제 #3
0
        /// <summary>
        /// 创建一个代理类型。
        /// </summary>
        /// <param name="type">要注入AOP的类型。</param>
        /// <param name="option"></param>
        /// <returns>代理类。</returns>
        public static Type BuildTypeCached(Type type, InterceptBuildOption option = null)
        {
            var cacheMgr = MemoryCacheManager.Instance;

            return(cacheMgr.TryGet(string.Concat("Aspect_", type.FullName), () => BuildType(type, option), () => NeverExpired.Instance));
        }
예제 #4
0
 /// <summary>
 /// 创建一个代理类型,并将代理类放入缓存中。
 /// </summary>
 /// <param name="type">要注入AOP的类型。</param>
 /// <param name="option"></param>
 /// <returns>代理类。</returns>
 public static Type BuildTypeCached(Type type, InterceptBuildOption option = null)
 {
     return(ReflectionCache.GetMember("Intercept", type, option, (t, o) => BuildType(t, o)));
 }