标识生成服务
IGeneratorProvider
提供主键标识值的生成。比如 Oracle
中使用它自己的序列作为主键值,而其他类型的数据库,BaseSequenceGenerator
使用一张辅助表来模拟存放序列值。
[TestMethod]
public void TestGetSequence()
{
using (var db = DatabaseFactory.CreateDatabase())
{
//获取 IGeneratorProvider
var generator = db.Provider.GetService<IGeneratorProvider>();
if (generator == null)
{
Console.WriteLine("不支持序列生成。");
return;
}
Console.WriteLine(generator.GenerateValue(db, "products"));
Console.WriteLine(generator.GenerateValue(db, "products"));
}
}
雪花算法生成器
如果你需要使用雪花算法来生成主键值,则可以继承 SnowflakeGenerator
类,并将其注册到 IProvider
中即可。如下所示:
public class MySnowflakeGenerator: SnowflakeGenerator
{
public MySnowflakeGenerator()
{
//分布式环境中,需要为每台服务器应用设置不同的 WorkerId,该值可以从配置文件中取出
WorkerId = 1;
}
}
然后更改 IProvider
的插件服务为 MySnowflakeGenerator
即可。这里使用 WrappedProvider
类是为了防止破坏 IProvider
的静态实例。如下所示:
public void TestUseMySnowflakeGenerator
{
using (var db = DatabaseFactory.CreateDatabase())
{
var wrapped = new WrappedProvider(db.Provider);
wrapped.RegisterService(new MySnowflakeGenerator());
var generator = wrapped.GetService<IGeneratorProvider>();
Console.WriteLine(generator.GenerateValue(db, "orders", "orderid"));
}
}