# donetframe **Repository Path**: complete_info/donetframe ## Basic Information - **Project Name**: donetframe - **Description**: 通用net框架,以Net8.0为基础,整合数据库访问层和基于stream的excel读写,统一的数据文件读写和统一的文件系统管理 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 2 - **Created**: 2026-04-02 - **Last Updated**: 2026-04-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 通用.net框架 [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/robinhood-jim/donetframe) ========= #### 介绍 基于.Net8.0以上的 基础框架,目前包含基本ORM 框架,可支持EF Core的注解方式,整个框架小而精,集成了最小功能集合的ORM功能,未考虑微软的语法树等功能。代码直观易懂,整体代码都是原创,可通过阅读整体框架对ORM有深入的了解 ##ORM 框架 说明 - 使用自定义的标签 MappingEntity MappingField - 使用全局的DAOFactory 管理注册的所有数据库链接 - 同一数据源下唯一的数据访问层 dao JdbcDao - 业务层 BaseRepository,带基本事务管理,可以扩展CRUD前后置操作,也可以完全自定义相应方法 - 类似Mybatis 的xml配置查询框架,配置支持js脚本语言 - 针对不同数据库,支持批量插入 - 支持对EF core的注解标注实体的支持 - 支持类似Java Resource的循环依赖注入 - 支持线程安全的DbContext ## Examples - 数据库相关配置 ```yaml dataSource: core: host: localhost port: 3316 dbType: Mysql userName: root password: root maxSize: 10 ``` 其中dbType 为数据库类型 - DAO/Repository 初始化 ```cs //工厂初始化 DAOFactory f = DAOFactory.init("f:/1.yaml"); //构造Repository BaseRepository repository = new Builder().build(); ``` - CRUD 操作 ```cs DAOFactory f = DAOFactory.init("f:/1.yaml"); BaseRepository repository = new Builder().build(); TestModel model = new TestModel(); ... //新增 repository.SaveEntity(model); //按主键获取 TestModel model=repository.GetById(1); //按单字段指定条件查询 IList list=repository.QueryModelsByField("name", Constants.SqlOperator.LIKE, new object[] { "t" }); //Update repository.UpdateEntity(model); //删除 repository.RemoveEntity(new long[] { 1 }.ToArray()); ``` - 批量插入 ```cs DAOFactory f = DAOFactory.init("f:/1.yaml"); BaseRepository repository = new Builder().build(); IList list = new List(); for (int i = 0; i < 1000; i++) { TestSimple simple = new TestSimple(); simple.name = "col" + Convert.ToString(i); simple.tValue = i; simple.dTime = DateTime.Now; list.Add(simple); } return repository.InsertBatch(list); ``` - 类似Mybatis 的Mapper 操作 及 分页 ```cs DAOFactory f = DAOFactory.init("f:/1.yaml"); BaseRepository repository = new Builder().build(); //查询分页 PageQuery query = new PageQuery(4); query.Parameters.Add("Name", "t%"); query.NameSpace = "Frameset.Test"; query.QueryId = "select1"; PageDTO list = repository.QueryPage(query); //执行Sql TestVO vo = new TestVO(); vo.Name = "test"; vo.Description = "test"; vo.CsId = 50; repository.ExecuteMapper("Frameset.Test", "insert1", vo); ``` - Mybatis 配置文件(基本兼容Mybatis语法,支持js脚本引擎) ```xml id,name,code_desc,cs_id,create_time name,code_desc,cs_id,create_time insert into t_test ( ) values ( ) insert into t_test values (@Name,@Description,@CsId,sysdate()) update t_test set where id=@Id ``` - 自定义线程安全DbContext 基于ThreadLocal,保证单DbContext可以线程安全的处理SaveChanges和每个请求一个Transaction两种模式,数据源可以运行时使用dsName动态切换 ```cs IDbContext context = new DbContext(); DbContextFactory.Register(context); ``` - 自定义的IoC支持 除了支持构造函数注入以外,加入Spring的Resource 标签的注入方法,并支持注入的递归操作,全面兼容Spring的注入方式(微软迟早要加入非构造函数注入的支持) ```cs RegServiceContext.ScanServices(typeof(ServiceAttribute)); [Service] public class UserOperService : IUserOperService { [Resource] private ISysUserRepository _userRepository; [Resource] private IBaseRepository _roleRepository; ... ``` - 统一的FileSystem与文件格式读写支持 基于统一的IFileSystem 与 AbstractDataIterator AbstractDataWrite,实现对本地文件系统,FTP/SFTP、HDFS以及云存储类型(S3/aliyun OSS/tencent COS)等文件系统支持,数据格式支持csv/json/xml/avro/parquet等格式 支持Dictionary 和对象两种模式 从文件系统读取,Dictionary 方式 ```java DataCollectionBuilder builder = DataCollectionBuilder.NewBuilder(); //using FileSystem Local builder.Path("e:/1.json.gz").FsType(Constants.FileSystemType.LOCAL); using (AbstractDataIterator> iterator = builder.Build().GetDataReader>()) { while (iterator.MoveNext()) { Dictionary valueMap = iterator.Current; Log.Information("{valueMap}", valueMap); } } ``` Model 对象方式 ```java DataCollectionBuilder builder = DataCollectionBuilder.NewBuilder(); //using FileSystem Local builder.Path("e:/1.json.gz").FsType(Constants.FileSystemType.LOCAL); using (AbstractDataIterator iterator = builder.Build().GetDataReader()) { while (iterator.MoveNext()) { TestModel model = iterator.Current; Log.Information("{Model}", model); } } ``` 写入文件系统 Dictionary 方式 ```java DataCollectionBuilder builder = DataCollectionBuilder.NewBuilder(); //assign Path and column metadata define builder.Path("e:/1.parquet").AddColumnDefine("id", Constants.MetaType.BIGINT).AddColumnDefine("name", Constants.MetaType.STRING) .AddColumnDefine("time", Constants.MetaType.TIMESTAMP).AddColumnDefine("amount", Constants.MetaType.INTEGER).AddColumnDefine("price", Constants.MetaType.DOUBLE); Dictionary cachedMap = new Dictionary(); Random random = new Random(1231313); long startTs = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds() - 3600 * 24 * 1000; DateTime dateTime = new DateTime(1970, 1, 1, 0, 0, 0, 0); using (AbstractDataWriter> writer = DataFileExporter.GetDataWriter>(builder.Build())) { for (int i = 0; i < 1000; i++) { cachedMap.Clear(); cachedMap.TryAdd("name", StringUtils.GenerateRandomChar(random, 12)); cachedMap.TryAdd("time", dateTime.AddMilliseconds(startTs + i * 1000)); cachedMap.TryAdd("amount", random.Next(1000) + 1); cachedMap.TryAdd("price", random.NextDouble() * 1000); cachedMap.TryAdd("id", Convert.ToInt64(i)); writer.WriteRecord(cachedMap); } } ``` - 自定义函数的Serverless 动态 装载DLL 实现 在承载的Asp.Net项目中appsetting.json 添加serverlessPrefix 参数 ```json { "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } }, "AllowedHosts": "*", "serverlessPrefix": "/serverless", } ``` 在承载的Class中调用方法加ServerlessFunc 的Attribute,并打包DLL ```cs public class TestService { [ServerlessFunc] public static object GetRole(HttpRequest request, HttpResponse response, long id, IBaseRepository repository) { ``` 使用 DynamicFunctionLoader的RegisterFunction在运行时进行注册 访问AspNet 项目对应对峙的 /serverless/{functionName} 动态调用方法