标识生成服务


  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"));
    }
}