CodeArts 是一套简单、高效的轻量级框架(涵盖了类型转换、实体复制、实体映射、动态代理类,以及基于Linq分析实现的、支持分表和读写分离的ORM框架)。
First, install NuGet. Then, install CodeArts from the package manager console:
PM> Install-Package CodeArts
Package | NuGet | Downloads | Jane Says Markdown |
---|---|---|---|
CodeArts | Core universal design. | ||
CodeArts.Middleware | IOC middleware. | ||
CodeArts.Caching | Caching rules. | ||
CodeArts.Casting | Type conversion, cloning, mapping. | ||
CodeArts.Configuration | Read configuration file. | ||
CodeArts.Json | JSON read and write processing. | ||
CodeArts.Net | Request component of HTTP/HTTPS. | ||
CodeArts.Emit | Abstract Syntax Tree(AST). | ||
CodeArts.Mvc | Model View Controller(MVC). | ||
CodeArts.Db | Database operation base library. | ||
CodeArts.Db.Lts | Independent research and development and long term maintenance of ORM. | ||
CodeArts.Db.EntityFramework | EF/EFCore simple package. | ||
CodeArts.Db.Linq2Sql | Linq to SQL. |
- 引包即用是指,安装
NuGet
包后,自动注入配置信息。 - 在启动方法中添加如下代码即可:
using (var startup = new XStartup())
{
startup.DoStartup();
}
-
作为单例基类。
public class ASingleton : Singleton<ASingleton> { private ASingleton(){ } } ASingleton singleton = ASingleton.Instance;
-
作为单例使用。
public class BSingleton { } BSingleton singleton = Singleton<BSingleton>.Instance
-
绝对单例。
public class CSingleton : Singleton<CSingleton> { private CSingleton(){ } } CSingleton singleton1 = CSingleton.Instance; CSingleton singleton2 = Singleton<CSingleton>.Instance; // 与“singleton1”是同一实例。
-
TryAddSingleton:添加单例实现。
-
Singleton:获取单例。
-
单例实现:
-
单例实现(一)。
- 添加默认支持的单例实现。
RuntimeServPools.TryAddSingleton<A,B>(); //=> true.
- 在未使用A的实现前,可以刷新单例实现支持。
RuntimeServPools.TryAddSingleton<A,C>(); //=> true; RuntimeServPools.TryAddSingleton<A>(new C()); //=> true;
-
单例实现(二)。
- 添加实例或工厂支持的单例实现。
RuntimeServPools.TryAddSingleton<A>(new B()); //=> true.
- 在未使用A的实现前,可以被实例或工厂刷新单例实现支持,默认支持方式不被生效。
RuntimeServPools.TryAddSingleton<A,C>(); //=> false; RuntimeServPools.TryAddSingleton<A>(new C()); //=> true;
-
-
单例使用:
-
单例使用(一)。
A a = RuntimeServPools.Singleton<A>();
未提前注入单例实现,会直接抛出
NotImplementedException
异常。 -
单例使用(二)。
A a = RuntimeServPools.Singleton<A,B>();
未提前注入单例实现,会尝试创建
B
实例。
-
-
说明:
-
TryAddSingleton<T>:使用实例时,使用【公共/非公共】无参构造函数创建实例。
-
TryAddSingleton<T1,T2>:使用实例时,尽量使用参数更多且被支持的公共构造函数创建实例。
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
的造函数生成实例。
-
-
命名方式。
/// <summary> 命名规范。 </summary> public enum NamingType { /// <summary> 默认命名(原样/业务自定义)。 </summary> Normal = 0, /// <summary> 驼峰命名,如:userName。 </summary> CamelCase = 1, /// <summary> url命名,如:user_name,注:反序列化时也需要指明。 </summary> UrlCase = 2, /// <summary> 帕斯卡命名,如:UserName。 </summary> PascalCase = 3 }
-
命名标记。
/// <summary> /// 命名特性。 /// </summary> [AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = false)] public sealed class NamingAttribute : Attribute { /// <summary> /// 名称。 /// </summary> public string Name { get; set; } /// <summary> /// 命名规范。 /// </summary> public NamingType NamingType { get; set; } /// <summary> /// 构造函数。 /// </summary> /// <param name="name">名称。</param> public NamingAttribute(string name) { Name = name; } /// <summary> /// 构造函数。 /// </summary> /// <param name="namingType">名称风格。</param> public NamingAttribute(NamingType namingType) { NamingType = namingType; } /// <summary> /// 构造函数。 /// </summary> /// <param name="name">名称。</param> /// <param name="namingType">名称风格。</param> public NamingAttribute(string name, NamingType namingType) : this(name) { NamingType = namingType; } }
-
指定命名方式。
string named = "name".ToNamingCase(NamingType.CamelCase);
-
特定命名方式。
-
帕斯卡命名(又称大驼峰)。
string named = "name".ToPascalCase();
-
驼峰命名。
string named = "name".ToCamelCase();
-
Url命名。
string named = "name".ToUrlCase();
-
-
普通方式。
T value = "key".Config<T>(); // 未找到时,返回指定类型的默认值。
T value = "key".Config(defaultValue); // 未找到时,返回defaultValue。
-
配置变更自动同步方式。
-
实现以下接口。
/// <summary> /// 配置变更监听能力。 /// </summary> public interface IConfigable<TSelf> where TSelf : class, IConfigable<TSelf> { /// <summary> /// 监听到变更后的新数据。 /// </summary> /// <param name="changedValue">变更后的数据。</param> void SaveChanges(TSelf changedValue); }
-
使用方式。
T value = "key".Config<T>(); // 未找到时,返回:null。
-
string value = "{a + b}".PropSugar(new { A = 1, B = 2 }, NamingType.CamelCase); //=> value = "3"。
-
语法说明:
-
空运算符:A?B、A ?? B
当A为
null
时,返回B,否则返回A。 -
合并运算符:A+B
当A和B可以参与运算时,返回运算结果。否则转成字符串拼接。
-
试空合并运算符:A?+B
当A为
null
时,返回B,否则按照【合并运算符】计算A+B的结果。 -
可支持任意组合,从左到右依次计算(不支持小括号)。
-
-
Nullable<T>:
T
的默认值。 -
值类型:默认值。
-
字符串类型:
string.Empty
。 -
自定义空实例实现:
Emptyable.Register
。-
普通类型。
Emptyable.Register<Version>(new Version());
-
继承或实现关系。
public class A{} public class B : A {} Emptyable.Register<A,B>();
-
泛型声明类型。
public class A<T>{} public class B<T> : A<T> {} Emptyable.Register(typeof(A<>),typeof(B<>));
-
-
其它:调用参数最多的构造函数生成默认值,确保构造函数参数相关内容不会为
null
。- 可选参数不为
null
时,直接使用可选参数默认值。 - 生成可空实例。
- 可选参数不为
-
不能生成非
null
空实例时,抛出异常。