Search code examples
asp.net-corestormpath

Add user to local database after registration in Stormpath


I want to add new user to my local database after register in Stormpath. In doc https://docs.stormpath.com/dotnet/aspnetcore/latest/registration.html#registration is section about post-registration handler. I have problem becouse i can't use UserRepository in StartUp file. I have error:

Unable to resolve service for type 'AppProject.Repositories.IUserRepository' while attempting to activate 'AppProject.Startup'


.

    public void ConfigureServices(IServiceCollection services, IUserRepository userRepository)
            {
    services.AddStormpath(new StormpathOptions()
               {
                Configuration = new StormpathConfiguration()
                {
                    Client = new ClientConfiguration()
                    {
                        ApiKey = new ClientApiKeyConfiguration()
                        {
                            Id = "xxxxxxxxxxx",
                            Secret = "xxxxxxxxx"
                        }
                    }
                },
                PostRegistrationHandler = (context, ct) =>
               {
                   return MyPostRegistrationHandler(context, ct, userRepository);
               }
            });
}



   private Task MyPostRegistrationHandler(PostRegistrationContext context, CancellationToken ct, IUserRepository userRepository)
        {
            userRepository.Add(new User(context.Account.Email, context.Account.FullName, context.Account.GivenName, context.Account.Surname, context.Account.Username));
            userRepository.SaveChangesAsync();
            return Task.FromResult(0);
        }

Solution

  • In this scenario, I don't think it can resolve dependency of IUserRepository in StartUp. You can try something like this.

    1) Add an extension method.

    public static IServiceProvider AddServices(this IServiceCollection services)
    {
        services.AddTransient<IUserRepository, UserRepository>();
        // rest of the things.
        return services.BuildServiceProvider();
    }
    

    2) Get the userRepository instance like like this.

       IServiceCollection services = new ServiceCollection();
       services.AddServices();
       var provider = services.BuildServiceProvider();
       var userRepository = provider.GetRequiredService<IUserRepository>();
    

    ConfigurationServices will not have IUserRepository input parameter.