# donetframe **Repository Path**: XIAOANDX/donetframe ## Basic Information - **Project Name**: donetframe - **Description**: dotnetframe是个人独立开发的基于NET8.0框架的面向具体应用开发的基础框架,基本无vibe coding,框架目标是简化具体开发中重复繁琐的crud等劳动,同时对若干常用的业务场景进行抽象,可以简化企业级开发 - **Primary Language**: C# - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2026-07-06 - **Last Updated**: 2026-07-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 通用.net框架 [![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/robinhood-jim/donetframe) ========= #### 介绍 dotnetframe是个人独立开发的基于NET8.0框架的面向具体应用开发的基础框架,框架目标是简化具体开发中重复繁琐的CRUD等劳动,同时对若干常用的业务场景进行抽象,提供了以下若干特性 ##框架 说明 - ORM:统一的DAO层,一个数据源对应一个DAO,repo(仓库层)与Controller基于单表进行基本操作封装,支持各种前后置操作,支持逻辑删除; - 统一的基于yaml的Configuration,内置License许可证管理能力; - Ioc参考Spring的实现,在支持够着函数注入基础上,支持依赖注入,同时依赖注入支持多级依赖逐级创建; - 加入了高效的excel和word读写功能,支持超大文件的高效读写; - 支持各种大数据格式文件的读写,也支持不同文件系统和云存储的统一读写; - 支持对大多数压缩格式的内置支持,可以在无需解压情况下直接内存读取; - 支持dll动态加载和卸载的Serverless实现; - 复杂Sql查询支持mybatis的配置与基于Builder的动态构建两种模式; - 大数据能力:支持NoSql以及图数据库的封装 - 支持线程安全的DbContext操作,依靠ThreadLocal实现,可减少Web应用队占用 ## Examples - 统一yaml配置 ```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} 动态调用方法