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