{"id":19990743,"url":"https://github.com/tinylit/codearts","last_synced_at":"2025-05-04T10:30:44.186Z","repository":{"id":38084100,"uuid":"213645344","full_name":"tinylit/codearts","owner":"tinylit","description":"【代码艺术】一款轻量高效的基础框架（包含类型转换、复制、映射，以及ORM支持）。","archived":true,"fork":false,"pushed_at":"2023-01-06T20:26:31.000Z","size":3315,"stargazers_count":44,"open_issues_count":9,"forks_count":6,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-04-10T04:56:41.332Z","etag":null,"topics":["cast","copy","csharp","lightweight","linq","map","mapper","mvc-core","mvc-framework","mysql","netcore","netcore-webapi","orm","orm-framework","sql","sqlserver","webapi"],"latest_commit_sha":null,"homepage":"","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tinylit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-10-08T13:10:51.000Z","updated_at":"2025-02-27T07:11:33.000Z","dependencies_parsed_at":"2023-02-06T08:45:57.460Z","dependency_job_id":null,"html_url":"https://github.com/tinylit/codearts","commit_stats":null,"previous_names":["tinylit/skybuilding"],"tags_count":3,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tinylit%2Fcodearts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tinylit%2Fcodearts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tinylit%2Fcodearts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tinylit%2Fcodearts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tinylit","download_url":"https://codeload.github.com/tinylit/codearts/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252319950,"owners_count":21729039,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cast","copy","csharp","lightweight","linq","map","mapper","mvc-core","mvc-framework","mysql","netcore","netcore-webapi","orm","orm-framework","sql","sqlserver","webapi"],"created_at":"2024-11-13T04:51:27.190Z","updated_at":"2025-05-04T10:30:42.049Z","avatar_url":"https://github.com/tinylit.png","language":"C#","readme":"![CodeArts](http://oss.jschar.com/codearts.png 'Logo')\n\n[![Gitee](https://gitee.com/static/images/logo-en.svg)](https://gitee.com/tinylit/codearts)\n[![Github](http://oss.jschar.com/logo_github.png)](https://github.com/tinylit/codearts)\n\n![GitHub](https://img.shields.io/github/license/tinylit/codearts.svg)\n![language](https://img.shields.io/github/languages/top/tinylit/codearts.svg)\n![codeSize](https://img.shields.io/github/languages/code-size/tinylit/codearts.svg)\n![appveyor-ci](https://img.shields.io/appveyor/ci/tinylit/codearts.svg)\n![AppVeyor tests (compact)](https://img.shields.io/appveyor/tests/tinylit/codearts.svg?compact_message)\n[![GitHub issues](https://img.shields.io/github/issues-raw/tinylit/codearts)](../../issues)\n\n\n\n### “CodeArts”是什么？\n\nCodeArts 是一套简单、高效的轻量级框架（涵盖了类型转换、实体复制、实体映射、动态代理类，以及基于Linq分析实现的、支持分表和读写分离的ORM框架）。\n\n### 如何安装？\nFirst, [install NuGet](http://docs.nuget.org/docs/start-here/installing-nuget). Then, install [CodeArts](https://www.nuget.org/packages/CodeArts/) from the package manager console: \n\n```\nPM\u003e Install-Package CodeArts\n```\n\nNuGet 包\n--------\n\n| Package | NuGet | Downloads | Jane Says \u003ckbd\u003eMarkdown\u003c/kbd\u003e |\n| ------- | ----- | --------- | --------- |\n| CodeArts | [![CodeArts](https://img.shields.io/nuget/v/CodeArts.svg)](https://www.nuget.org/packages/CodeArts/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts) | Core universal design. |\n| CodeArts.Middleware | [![CodeArts.Middleware](https://img.shields.io/nuget/v/CodeArts.Middleware.svg)](https://www.nuget.org/packages/CodeArts.Middleware/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts.Middleware) | [IOC middleware.](./CodeArts.Middleware.md) |\n| CodeArts.Caching | [![CodeArts.Caching](https://img.shields.io/nuget/v/CodeArts.Caching.svg)](https://www.nuget.org/packages/CodeArts.Caching/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts.Caching) | [Caching rules.](./CodeArts.Caching.md) |\n| CodeArts.Casting | [![CodeArts.Casting](https://img.shields.io/nuget/v/CodeArts.Casting.svg)](https://www.nuget.org/packages/CodeArts.Casting/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts.Casting) | [Type conversion, cloning, mapping.](./CodeArts.Casting.md) |\n| CodeArts.Configuration | [![CodeArts.Configuration](https://img.shields.io/nuget/v/CodeArts.Configuration.svg)](https://www.nuget.org/packages/CodeArts.Configuration/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts.Configuration) | [Read configuration file.](./CodeArts.Configuration.md) |\n| CodeArts.Json | [![CodeArts.Json](https://img.shields.io/nuget/v/CodeArts.Json.svg)](https://www.nuget.org/packages/CodeArts.Json/) | ![Nuget](https://img.shields.io/nuget/dt/Codearts.Json) | [JSON read and write processing.](./CodeArts.Json.md) |\n| CodeArts.Net | [![CodeArts.Net](https://img.shields.io/nuget/v/CodeArts.Net.svg)](https://www.nuget.org/packages/CodeArts.Net/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts.Net) | [Request component of HTTP/HTTPS.](./CodeArts.Net.md) |\n| CodeArts.Emit | [![CodeArts.Emit](https://img.shields.io/nuget/v/CodeArts.Emit.svg)](https://www.nuget.org/packages/CodeArts.Emit/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts.Emit) | Abstract Syntax Tree(AST). |\n| CodeArts.Mvc | [![CodeArts.Mvc](https://img.shields.io/nuget/v/CodeArts.Mvc.svg)](https://www.nuget.org/packages/CodeArts.Mvc/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts.Mvc) | [Model View Controller(MVC).](./CodeArts.Mvc.md) |\n| CodeArts.Db | [![CodeArts.Db](https://img.shields.io/nuget/v/CodeArts.Db.svg)](https://www.nuget.org/packages/CodeArts.Db/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts.Db) | [Database operation base library.](./CodeArts.Db.md) |\n| CodeArts.Db.Lts | [![CodeArts.Db.Lts](https://img.shields.io/nuget/v/CodeArts.Db.Lts.svg)](https://www.nuget.org/packages/CodeArts.Db.Lts/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts.Db.Lts) | [Independent research and development and long term maintenance of ORM.](./CodeArts.Db.Lts.md) |\n| CodeArts.Db.EntityFramework | [![CodeArts.Db.EntityFramework](https://img.shields.io/nuget/v/CodeArts.Db.EntityFramework.svg)](https://www.nuget.org/packages/CodeArts.Db.EntityFramework/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts.Db.EntityFramework) | [EF/EFCore simple package.](./CodeArts.Db.EntityFramework.md) |\n| CodeArts.Db.Linq2Sql | [![CodeArts.Db.Linq2Sql](https://img.shields.io/nuget/v/CodeArts.Db.Linq2Sql.svg)](https://www.nuget.org/packages/CodeArts.Db.Linq2Sql/) | ![Nuget](https://img.shields.io/nuget/dt/CodeArts.Db.Linq2Sql) | [Linq to SQL.](./CodeArts.Db.Linq2Sql.md) |\n\n### 引包即用？\n\n* 引包即用是指，安装 `NuGet` 包后，自动注入配置信息。\n* 在启动方法中添加如下代码即可：\n``` csharp\nusing (var startup = new XStartup())\n{\n    startup.DoStartup();\n}\n```\n\n### 单例。\n\n* 作为单例基类。\n\n  ```c#\n  public class ASingleton : Singleton\u003cASingleton\u003e {\n      private ASingleton(){ }\n  }\n  \n  ASingleton singleton = ASingleton.Instance;\n  ```\n\n* 作为单例使用。\n\n  ```c#\n  public class BSingleton {   \n  }\n  \n  BSingleton singleton = Singleton\u003cBSingleton\u003e.Instance\n  ```\n\n* 绝对单例。\n\n  ```c#\n  public class CSingleton : Singleton\u003cCSingleton\u003e {\n      private CSingleton(){ }\n  }\n  \n  CSingleton singleton1 = CSingleton.Instance;\n  CSingleton singleton2 = Singleton\u003cCSingleton\u003e.Instance; // 与“singleton1”是同一实例。\n  ```\n\n### 服务池。\n\n* TryAddSingleton：添加单例实现。\n\n* Singleton：获取单例。\n\n* 单例实现：\n\n  - 单例实现（一）。\n\n    - 添加默认支持的单例实现。\n\n    ```c#\n    RuntimeServPools.TryAddSingleton\u003cA,B\u003e(); //=\u003e true.\n    ```\n\n    - 在未使用A的实现前，可以刷新单例实现支持。\n\n    ```c#\n    RuntimeServPools.TryAddSingleton\u003cA,C\u003e(); //=\u003e true;\n    RuntimeServPools.TryAddSingleton\u003cA\u003e(new C()); //=\u003e true;\n    ```\n\n  - 单例实现（二）。\n\n    - 添加实例或工厂支持的单例实现。\n\n    ```c#\n    RuntimeServPools.TryAddSingleton\u003cA\u003e(new B()); //=\u003e true.\n    ```\n\n    - 在未使用A的实现前，可以被实例或工厂刷新单例实现支持，默认支持方式不被生效。\n\n    ```c#\n    RuntimeServPools.TryAddSingleton\u003cA,C\u003e(); //=\u003e false;\n    RuntimeServPools.TryAddSingleton\u003cA\u003e(new C()); //=\u003e true;\n    ```\n\n* 单例使用：\n\n  - 单例使用（一）。\n\n    ```c#\n    A a = RuntimeServPools.Singleton\u003cA\u003e();\n    ```\n\n    未提前注入单例实现，会直接抛出`NotImplementedException`异常。\n\n  - 单例使用（二）。\n\n    ```c#\n    A a = RuntimeServPools.Singleton\u003cA,B\u003e();\n    ```\n\n    未提前注入单例实现，会尝试创建`B`实例。\n\n- 说明：\n\n  - TryAddSingleton\u0026lt;T\u0026gt;：使用实例时，使用【公共/非公共】无参构造函数创建实例。\n\n  - TryAddSingleton\u0026lt;T1,T2\u0026gt;：使用实例时，尽量使用参数更多且被支持的公共构造函数创建实例。\n\n    ```c#\n    public class A {\n    }\n    public class B {\n        private readonly A a;\n        public B() : this(new A()){ }\n        Public B(A a){ this.a = a ?? throw new ArgumentNullException(nameof(a)); }\n    }\n    ```\n\n    使用单例时，未注入A的单例实现，使用无参构造函数生成实例。\n\n    使用单例时，已注入A的单例实现，使用参数`A`的造函数生成实例。\n\n### 命名规范。\n\n* 命名方式。\n\n  ```c#\n  /// \u003csummary\u003e 命名规范。 \u003c/summary\u003e\n  public enum NamingType\n  {\n      /// \u003csummary\u003e 默认命名(原样/业务自定义)。 \u003c/summary\u003e\n      Normal = 0,\n  \n      /// \u003csummary\u003e 驼峰命名,如：userName。 \u003c/summary\u003e\n      CamelCase = 1,\n  \n      /// \u003csummary\u003e url命名,如：user_name，注：反序列化时也需要指明。 \u003c/summary\u003e\n      UrlCase = 2,\n  \n      /// \u003csummary\u003e 帕斯卡命名,如：UserName。 \u003c/summary\u003e\n      PascalCase = 3\n  }\n  ```\n\n* 命名标记。\n\n  ```c#\n  /// \u003csummary\u003e\n  /// 命名特性。\n  /// \u003c/summary\u003e\n  [AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = false)]\n  public sealed class NamingAttribute : Attribute\n  {\n      /// \u003csummary\u003e\n      /// 名称。\n      /// \u003c/summary\u003e\n      public string Name { get; set; }\n  \n      /// \u003csummary\u003e\n      /// 命名规范。\n      /// \u003c/summary\u003e\n      public NamingType NamingType { get; set; }\n  \n      /// \u003csummary\u003e\n      /// 构造函数。\n      /// \u003c/summary\u003e\n      /// \u003cparam name=\"name\"\u003e名称。\u003c/param\u003e\n      public NamingAttribute(string name)\n      {\n          Name = name;\n      }\n  \n      /// \u003csummary\u003e\n      /// 构造函数。\n      /// \u003c/summary\u003e\n      /// \u003cparam name=\"namingType\"\u003e名称风格。\u003c/param\u003e\n      public NamingAttribute(NamingType namingType)\n      {\n          NamingType = namingType;\n      }\n      /// \u003csummary\u003e\n      /// 构造函数。\n      /// \u003c/summary\u003e\n      /// \u003cparam name=\"name\"\u003e名称。\u003c/param\u003e\n      /// \u003cparam name=\"namingType\"\u003e名称风格。\u003c/param\u003e\n      public NamingAttribute(string name, NamingType namingType) : this(name)\n      {\n          NamingType = namingType;\n      }\n  }\n  ```\n\n### 命名转换。\n\n* 指定命名方式。\n\n  ```c#\n  string named = \"name\".ToNamingCase(NamingType.CamelCase);\n  ```\n\n* 特定命名方式。\n\n  - 帕斯卡命名（又称大驼峰）。\n\n    ```c#\n    string named = \"name\".ToPascalCase();\n    ```\n\n  - 驼峰命名。\n\n    ```c#\n    string named = \"name\".ToCamelCase();\n    ```\n\n  - Url命名。\n\n    ```c#\n    string named = \"name\".ToUrlCase();\n    ```\n\n### 读取配置文件。\n\n* 普通方式。\n\n  ```c#\n  T value = \"key\".Config\u003cT\u003e(); // 未找到时，返回指定类型的默认值。\n  ```\n\n  ```c#\n  T value = \"key\".Config(defaultValue); // 未找到时，返回defaultValue。\n  ```\n\n* 配置变更自动同步方式。\n\n  - 实现以下接口。\n\n    ```c#\n    /// \u003csummary\u003e\n    /// 配置变更监听能力。\n    /// \u003c/summary\u003e\n    public interface IConfigable\u003cTSelf\u003e where TSelf : class, IConfigable\u003cTSelf\u003e\n    {\n    \t/// \u003csummary\u003e\n    \t/// 监听到变更后的新数据。\n    \t/// \u003c/summary\u003e\n    \t/// \u003cparam name=\"changedValue\"\u003e变更后的数据。\u003c/param\u003e\n    \tvoid SaveChanges(TSelf changedValue);\n    }\n    ```\n\n  - 使用方式。\n\n    ```c#\n    T value = \"key\".Config\u003cT\u003e(); // 未找到时，返回:null。\n    ```\n\n### 字符串语法糖。\n\n```c#\nstring value = \"{a + b}\".PropSugar(new { A = 1, B = 2 }, NamingType.CamelCase); //=\u003e value = \"3\"。\n```\n\n* 语法说明：\n\n  - 空运算符：A?B、A ?? B\n\n    当A为`null`时，返回B，否则返回A。\n\n  - 合并运算符：A+B\n\n    当A和B可以参与运算时，返回运算结果。否则转成字符串拼接。\n\n  - 试空合并运算符：A?+B\n\n    当A为`null`时，返回B，否则按照【合并运算符】计算A+B的结果。\n\n  - 可支持任意组合，从左到右依次计算（不支持小括号）。\n\n### 可空能力（非`null`空实例）。\n\n* Nullable\u0026lt;T\u0026gt;：`T`的默认值。\n\n* 值类型：默认值。\n\n* 字符串类型：`string.Empty`。\n\n* 自定义空实例实现：`Emptyable.Register`。\n\n  - 普通类型。\n\n    ```c#\n    Emptyable.Register\u003cVersion\u003e(new Version());\n    ```\n\n  - 继承或实现关系。\n\n    ```c#\n    public class A{}\n    public class B : A {}\n    \n    Emptyable.Register\u003cA,B\u003e();\n    ```\n\n  - 泛型声明类型。\n\n    ```c#\n    public class A\u003cT\u003e{}\n    public class B\u003cT\u003e : A\u003cT\u003e {}\n    \n    Emptyable.Register(typeof(A\u003c\u003e),typeof(B\u003c\u003e));\n    ```\n\n* 其它：调用参数最多的构造函数生成默认值，确保构造函数参数相关内容不会为`null`。\n\n  - 可选参数不为`null`时，直接使用可选参数默认值。\n  - 生成可空实例。\n\n* 不能生成非`null`空实例时，抛出异常。\n\n### 标星历程图。\n\n[![Stargazers over time](https://starchart.cc/tinylit/CodeArts.svg)](https://starchart.cc/tinylit/CodeArts)\n","funding_links":[],"categories":["C\\#"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftinylit%2Fcodearts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftinylit%2Fcodearts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftinylit%2Fcodearts/lists"}