【代码艺术】一款轻量高效的基础框架(包含类型转换、复制、映射,以及ORM支持)。
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.
RuntimeServPools.TryAddSingleton<A,C>(); //=> true;
RuntimeServPools.TryAddSingleton<A>(new C()); //=> true;
单例实现(二)。
RuntimeServPools.TryAddSingleton<A>(new B()); //=> true.
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的结果。
可支持任意组合,从左到右依次计算(不支持小括号)。
null
空实例)。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
空实例时,抛出异常。