https://github.com/tinylit/inkslab
【架构体系】笔墨纸砚,笔是灵魂、墨是自研、纸是平台、砚是辅助和支持。
https://github.com/tinylit/inkslab
dependency-injection high-performance json lightweight map xml
Last synced: about 1 year ago
JSON representation
【架构体系】笔墨纸砚,笔是灵魂、墨是自研、纸是平台、砚是辅助和支持。
- Host: GitHub
- URL: https://github.com/tinylit/inkslab
- Owner: tinylit
- License: mit
- Created: 2022-07-20T11:31:57.000Z (almost 4 years ago)
- Default Branch: main
- Last Pushed: 2025-06-05T06:48:22.000Z (about 1 year ago)
- Last Synced: 2025-06-05T07:56:58.736Z (about 1 year ago)
- Topics: dependency-injection, high-performance, json, lightweight, map, xml
- Language: C#
- Homepage:
- Size: 678 KB
- Stars: 12
- Watchers: 1
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README






[](../../issues)
### “Inkslab”是什么?
Inkslab 是一套简单、高效的轻量级框架(涵盖了对象映射、配置读取、Xml/Json序列化和反序列化、以及自动/定制化依赖注入)。
### 如何安装?
First, [install NuGet](http://docs.nuget.org/docs/start-here/installing-nuget). Then, install [Inkslab](https://www.nuget.org/packages/inkslab/) from the package manager console:
```
PM> Install-Package Inkslab
```
### 引包即用?
* 引包即用是指,安装 `NuGet` 包后,自动注入配置信息。
* 在启动方法中添加如下代码即可:
``` csharp
using (var startup = new XStartup())
{
startup.DoStartup();
}
```
NuGet 包
--------
| Package | NuGet | Downloads | Jane Says Markdown |
| ------- | ----- | --------- | --------- |
| Inkslab | [](https://www.nuget.org/packages/inkslab/) |  | Core universal design. |
| Inkslab.Map | [](https://www.nuget.org/packages/inkslab.map/) |  | [Type conversion, cloning, mapping.](./Inkslab.Map.md) |
| Inkslab.Config | [](https://www.nuget.org/packages/inkslab.config/) |  | [Read configuration file.](./Inkslab.Config.md) |
| Inkslab.Json | [](https://www.nuget.org/packages/inkslab.json/) |  | [JSON read and write processing.](./Inkslab.Json.md) |
| Inkslab.Net | [](https://www.nuget.org/packages/inkslab.net/) |  | [Request component of HTTP/HTTPS.](./Inkslab.Net.md) |
### 内置功能。
* Xml 系列化和反序列化助手。
- 使用方式。
```c#
///
/// 序列化实体。
///
[XmlRoot("xml")]
public class XmlA
{
///
/// 忽略字段。
///
[Ignore] //? 忽略字段。
public int A1 { get; set; } = 100;
///
/// 生成
///
public CData A2 { get; set; }
///
///
///
public string A3 { get; set; }
///
///
///
public DateTime A4 { get; set; }
}
///
/// 反序列化实体。
///
[XmlRoot("xml")]
public class XmlB
{
///
/// 忽略字段。
///
[Ignore] //? 忽略字段。
public int A1 { get; set; } = 100;
///
///
///
public string A2 { get; set; }
///
///
///
public string A3 { get; set; }
///
///
///
public DateTime A4 { get; set; }
}
```
* 序列化。
```c#
XmlA x = new XmlA
{
A1 = 200,
A2 = "测试CData节点",
A3 = "普通节点",
A4 = DateTime.Now
};
string xml = XmlHelper.XmlSerialize(x);
```
* 反序列化。
```c#
string xml ="普通节点2022-12-03T14:53:29.1218173+08:00";
XmlB y = XmlHelper.XmlDeserialize(xml);
```
* 自定义程序集查找器。
- 自定义【IDirectory】。
```c#
public class CustomDirectory : IDirectory
{
public string[] GetFiles(string path, string searchPattern) => Directory.GetFiles(path, searchPattern);
}
```
- 注入到单列池中。
```c#
SingletonPools.TryAdd();
```
* 配置文件助手。
- 使用方式:
* 普通类型。
```c#
var value = "config-key".Config(); // 返回结果字符串。
```
* 监听类型。
```c#
var options = "config-key".Options(); // 返回IOptions<string>配置。
var value = options.Value; // 配置文件发生变化时,“options.Value”会被更新。
```
- 默认实现,
```
PM> Install-Package Inkslab.Config
```
- 如需自定义,请参考 [Inkslab.Config](Inkslab.Config.md 'Logo') 文稿。
* Json 序列化和反序列化助手。
- 使用方式:
* 序列化。
```c#
string json = JsonHelper.ToJson(new { Id = KeyGen.Id(), Timestamp = DateTime.Now });
```
* 反序列化。
```c#
///
/// 序列化类型。
///
public class A
{
///
/// 不序列化这个属性。
///
[Ignore]
public int A1 { get; set; } = 100;
///
///
///
public int A2 { get; set; }
///
///
///
public string A3 { get; set; } = string.Empty;
///
///
///
public DateTime A4 { get; set; }
}
string json = "{\"A2\":100,\"A3\":\"A3\",\"A4\":\"2022-12-03 14:17:55.7425309+08:00\"}"; // JSON 字符串。
A a = JsonHelper.Json(json); // 转换实体、匿名类型请参考重载方法。
```
- 默认实现,
```
PM> Install-Package Inkslab.Json
```
- 如需自定义,请参考 [Inkslab.Json](Inkslab.Json.md 'Logo') 文稿。
* 对象映射。
- 使用方式。
```c#
FooDto fooDto = Mapper.Map(foo);
BarDto barDto = Mapper.Map(bar);
```
- 默认实现,
```
PM> Install-Package Inkslab.Map
```
- 如需自定义或了解**高级语法**,请参考 [Inkslab.Map](Inkslab.Map.md 'Logo') 文稿。
* 主键生成器。
- 使用方式。
```c#
long id = KeyGen.Id();
```
- 默认实现:雪花算法。
- 设置机房和机号。
```c#
SingletonPools.TryAdd(new KeyOptions(workerId, datacenterId));
```
- 自定义主键生成器。
- 实现接口。
```c#
///
/// KeyGen 创建器。
///
public interface IKeyGenFactory
{
///
/// 创建。
///
///
IKeyGen Create();
}
```
- 注入实现。
```c#
SingletonPools.TryAdd();
```
- 正常使用。
### 单例。
* 作为单例基类。
```c#
public class ASingleton : Singleton {
private ASingleton(){ }
}
ASingleton singleton = ASingleton.Instance;
```
* 作为单例使用。
```c#
public class BSingleton {
}
BSingleton singleton = Singleton.Instance
```
* 绝对单例。
```c#
public class CSingleton : Singleton {
private CSingleton(){ }
}
CSingleton singleton1 = CSingleton.Instance;
CSingleton singleton2 = Singleton.Instance; // 与“singleton1”是同一实例。
```
### 单例池。
* TryAdd:添加单例实现。
* Singleton:获取单例。
* 单例实现:
- 单例实现(一)。
- 添加默认支持的单例实现。
```c#
SingletonPools.TryAdd(); //=> true.
```
- 在未使用A的实现前,可以刷新单例实现支持。
```c#
SingletonPools.TryAdd(); //=> true;
SingletonPools.TryAdd(new C()); //=> true;
```
- 单例实现(二)。
- 添加实例或工厂支持的单例实现。
```c#
SingletonPools.TryAdd(new B()); //=> true.
```
- 在未使用A的实现前,可以被实例或工厂刷新单例实现支持,默认支持方式不被生效。
```c#
SingletonPools.TryAdd(); //=> false;
SingletonPools.TryAdd(new C()); //=> true;
```
* 单例使用:
- 单例使用(一)。
```c#
A a = SingletonPools.Singleton();
```
未提前注入单例实现,会直接抛出`NotImplementedException`异常。
- 单例使用(二)。
```c#
A a = SingletonPools.Singleton();
```
未提前注入单例实现,会尝试创建`B`实例。
- 说明:
- TryAdd<T>:使用实例时,使用【公共/非公共】无参构造函数创建实例。
- TryAdd<T1,T2>:使用实例时,尽量使用参数更多且被支持的公共构造函数创建实例。
```c#
public class A {
}
public class B {
private readonly A a;
public B() : this(new A()){ }
Public B(A a){ this.a = a ?? throw new ArgumentNullException(nameof(a)); }
}
```
使用单例时,未注入A的单例实现,使用无参构造函数生成实例。
使用单例时,已注入A的单例实现,使用参数`A`的造函数生成实例。
### 命名规范。
* 命名方式。
```c#
/// 命名规范。
public enum NamingType
{
/// 默认命名(原样/业务自定义)。
Normal = 0,
/// 驼峰命名,如:userName。
CamelCase = 1,
/// 蛇形命名,如:user_name,注:反序列化时也需要指明。
SnakeCase = 2,
/// 帕斯卡命名,如:UserName。
PascalCase = 3,
/// 短横线命名,如:user-name。
KebabCase = 4
}
```
### 命名转换(三种命名可以相互转换)。
* 指定命名方式。
```c#
string named = "name".ToNamingCase(NamingType.CamelCase);
```
* 特定命名方式。
- 帕斯卡命名(又称大驼峰)。
```c#
string named = "user_name".ToPascalCase(); // UserName
```
- 驼峰命名。
```c#
string named = "user_name".ToCamelCase(); // userName
```
- 蛇形命名。
```c#
string named = "user_name".ToSnakeCase(); // user_name
```
- 短横线命名
```c#
string named = "user_name".ToKebabCase(); // user-name
```
### 字符串语法糖。
```c#
string value = "${a + b}".PropSugar(new { A = 1, B = 2 }); //=> value = "3"。
```
* 语法说明:
- 空运算符:A ? B、A ?? B
当A为`null`时,返回B,否则返回A。
- 合并运算符:A + B
当A和B可以参与运算时,返回运算结果。否则转成字符串拼接。
- 试空合并运算符:A ?+ B
当A为`null`时,返回`null`,否则按照【合并运算符】计算A+B的结果。
- 属性后代:A.B 或 A.B.C ...
标星历程图。
[](https://starchart.cc/tinylit/inkslab)