亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在身份模塊上播種初始用戶,無需雙重播種

在身份模塊上播種初始用戶,無需雙重播種

C#
九州編程 2023-09-09 16:14:29
我正在嘗試使用 ABP 的身份模塊并為我的第一個(管理員)用戶提供種子。在身份模塊種子貢獻者的源代碼中,我看到了這一點:public Task SeedAsync(DataSeedContext context){    return _identityDataSeeder.SeedAsync(        context["AdminEmail"] as string ?? "[email protected]",        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我之前的所有內容,以便只有我的內容被執行?
查看完整描述

1 回答

?
qq_笑_17

TA貢獻1818條經驗 獲得超7個贊

這個特定問題的解決方案(盡管我希望找到一個更“通用”的解決方案)是改變實際的貢獻者。在您的域模塊(或您認為合適的任何地方:您的遷移器或其他),只需執行以下操作:


// Remove the contributor for the module

context.Services.RemoveAll(t => t.ImplementationType == typeof(IdentityDataSeedContributor));

// Add my custom constributor

context.Services.AddTransient<IDataSeedContributor, MyCustomConstributor>();

其中貢獻者的實現只是默認的副本:


public class MyCustomConstributor : IDataSeedContributor

{

    private readonly IIdentityDataSeeder _identityDataSeeder;


    public IdentityDataSeedContributor(IIdentityDataSeeder identityDataSeeder)

    {

        _identityDataSeeder = identityDataSeeder;

    }


    public Task SeedAsync(DataSeedContext context)

    {

        return _identityDataSeeder.SeedAsync(

            context["AdminEmail"] as string ?? "my@admin-email",

            context["AdminPassword"] as string ?? "my-admin-password",

            context.TenantId

        );

    }

}

請注意,您仍然在這里獲得用戶名admin...如果您想更改它,您也可以替換實現IIdentityDataSeeder(使用相同的方法,或者更簡單的方法Services.Replace,您可以使用它,因為應該只有一種實現IIdentityDataSeeder)并復制您自己的默認用戶名,更改搜索到的用戶名。


目前,更換模塊上的服務似乎是可行的方法。也許在未來的版本中可能存在直接攔截其他模塊的初始化階段的可能性,但我現在還沒有看到如何實現。


查看完整回答
反對 回復 2023-09-09
  • 1 回答
  • 0 關注
  • 111 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號