public static Assembly CompileAll(Assembly assembly, IInjectionProvider injection) { return(cache.GetOrAdd(assembly.FullName, () => { var assemblyName = string.Concat(assembly.GetName().Name, "_Dynamic"); var assemblyBuilder = new DynamicAssemblyBuilder(assemblyName); assembly.GetExportedTypes() .Where(s => s.IsNotCompiled()) .ForEach(s => EntityProxyBuilder.BuildType(s, null, assemblyBuilder, injection)); return assemblyBuilder.AssemblyBuilder; })); }
private static Assembly GetAssemblyFromCache(Assembly assembly) { var lazy = new Lazy <Assembly>(() => { var assemblyName = string.Concat(assembly.GetName().Name, "_Dynamic"); var assemblyBuilder = new DynamicAssemblyBuilder(assemblyName); assembly.GetExportedTypes() .Where(s => s.IsNotCompiled()) .ForEach(s => EntityProxyBuilder.BuildType(s, null, assemblyBuilder)); return(assemblyBuilder.AssemblyBuilder); }); return(cache.GetOrAdd(assembly.FullName, t => lazy.Value)); }
/// <summary> /// 编译程序集中的所有类型。 /// </summary> /// <param name="contextType">当前上下文实例的类型。</param> /// <param name="assembly">当前的程序集。</param> /// <param name="types">指定需要编译的类型,如果为 null 则遍列 <paramref name="assembly"/> 中的所有可导出类型。</param> /// <param name="injection">用来向实体类中注入代码。</param> /// <returns></returns> public static Assembly CompileAll(Type contextType, Assembly assembly, Type[] types, IInjectionProvider injection) { var assemblyKey = new EntityAssemblyKey { ContextType = contextType, Assembly = assembly }; return(_cache.GetOrAdd(assemblyKey, key => { var rndNo = RandomGenerator.Create(); var assemblyName = string.Concat(key.Assembly.GetName().Name, ".", rndNo); var assemblyBuilder = new DynamicAssemblyBuilder(assemblyName); types ??= key.Assembly.GetExportedTypes(); types.Where(s => s.IsNotCompiled() && !s.IsSealed) .ForEach(s => EntityProxyBuilder.BuildType(s, null, assemblyBuilder, injection)); return assemblyBuilder.AssemblyBuilder; })); }