在身份模块上播种初始用户,无需双重播种

我正在尝试使用 ABP 的身份模块并为我的第一个(管理员)用户提供种子。


在身份模块种子贡献者的源代码中,我看到了这一点:


public Task SeedAsync(DataSeedContext context)

{

    return _identityDataSeeder.SeedAsync(

        context["AdminEmail"] as string ?? "admin@abp.io",

        context["AdminPassword"] as string ?? "1q2w3E*",

        context.TenantId

    );

}

所以在我的迁移器模块中我添加了以下内容:


public override void OnApplicationInitialization(ApplicationInitializationContext context)

{

    using (var scope = context.ServiceProvider.CreateScope())

    {

        var dataSeeder = scope.ServiceProvider.GetRequiredService<IDataSeeder>();

        var dsCtx = new DataSeedContext

        {

            ["AdminEmail"] = "my@admin-email", 

            ["AdminPassword"] = "my-admin-password"

        };

        AsyncHelper.RunSync(() => dataSeeder.SeedAsync(dsCtx));

    }

    base.OnApplicationInitialization(context);

}

这有效...但是可能有另一个模块创建数据播种器(更可能是在迁移器上实际执行的模块,但我找不到它),因此我所有的贡献者(可能还有模块贡献者)都被执行两次(我想这是可以预料的)。


有什么方法可以在不实际运行的情况下更改播种上下文IDataSeeder?如果这不能完成...有没有一种方法可以“取消注册”IDataSeeder我之前的所有内容,以便只有我的内容被执行?


九州编程
浏览 74回答 1
1回答

qq_笑_17

这个特定问题的解决方案(尽管我希望找到一个更“通用”的解决方案)是改变实际的贡献者。在您的域模块(或您认为合适的任何地方:您的迁移器或其他),只需执行以下操作:// Remove the contributor for the modulecontext.Services.RemoveAll(t => t.ImplementationType == typeof(IdentityDataSeedContributor));// Add my custom constributorcontext.Services.AddTransient<IDataSeedContributor, MyCustomConstributor>();其中贡献者的实现只是默认的副本:public class MyCustomConstributor : IDataSeedContributor{&nbsp; &nbsp; private readonly IIdentityDataSeeder _identityDataSeeder;&nbsp; &nbsp; public IdentityDataSeedContributor(IIdentityDataSeeder identityDataSeeder)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; _identityDataSeeder = identityDataSeeder;&nbsp; &nbsp; }&nbsp; &nbsp; public Task SeedAsync(DataSeedContext context)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; return _identityDataSeeder.SeedAsync(&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context["AdminEmail"] as string ?? "my@admin-email",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context["AdminPassword"] as string ?? "my-admin-password",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; context.TenantId&nbsp; &nbsp; &nbsp; &nbsp; );&nbsp; &nbsp; }}请注意,您仍然在这里获得用户名admin...如果您想更改它,您也可以替换实现IIdentityDataSeeder(使用相同的方法,或者更简单的方法Services.Replace,您可以使用它,因为应该只有一种实现IIdentityDataSeeder)并复制您自己的默认用户名,更改搜索到的用户名。目前,更换模块上的服务似乎是可行的方法。也许在未来的版本中可能存在直接拦截其他模块的初始化阶段的可能性,但我现在还没有看到如何实现。
打开App,查看更多内容
随时随地看视频慕课网APP