Vicanent
Vicanent
用 AsType 指定动态类型的方式,在多租户共用服务时可能会存在过期缓存占用内存。 我根据租户分配命名空间,根据自定义数据结构从继承数据基类生成动态类型,然后使用动态创建的类型调用 CodeFirst.SyncStructure 自动生成表(包括按月分表),操作时 fsql.Select().AsType(dynamicType)。 看源码有几个 static ConcurrentDictionary 做缓存,字典 key 是 Type, 虽然租户只在初始化时会调整数据结构,但是长时间不重启服务就会有很多的过时的缓存。 我的方案是每次重新生成新的类型时通过反射获取到缓存手动清除。 看叶老板 @2881099 是否有意在字典缓存这块适配动态编译类型的情况,根据类型全名(命名空间+类名)区分缓存或者有个方法能够一句代码清空Type关联的静态字典缓存。
感谢 @2881099 提供的实现思路,过几天再尝试实现
original: 实现了一下根据类型全名删除缓存的方法,贴一下代码 2022/05/09: append: 增加 Natasha 动态类构建示例 ```csharp public Type BuildClass() { var nClass = NClass.CreateDomain($"DNC{FreeUtil.NewMongodbId():N}", opts => opts.CompileWithAssemblyLoadBehavior(LoadBehaviorEnum.UseDefault)); nClass.LoadDomainUsing().NoGlobalUsing().Using(); nClass.Namespace("DynamicCustomType").Public(); if (this.TypeId > 0) nClass.Name($"Custom{this.TableType}Table{this.TypeId}"); else nClass.Name($"System{this.TableType}Table{Math.Abs(this.TypeId)}"); nClass.AttributeAppend($"\"{this.TableTitle}\""); nClass.InheritanceAppend();...
研究了 `CS-Script` 和 `Natasha` 的实现,整出了动态编译的最小可行实现。 仅需要NuGet引用的一个包 `Microsoft.CodeAnalysis.CSharp` 即可。 ``` ``` ```csharp using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Text; using System.Reflection; using System.Reflection.Metadata; using System.Runtime.Loader; using System.Text; public partial class DataProvider {...