Register multiple implementations
services.AddScoped<Service1>();
services.AddScoped<Service2>();
services.AddScoped<Func<int, IContractService>>(serviceProvider=> key=>
{
switch(key)
{
case 1:
return serviceProvider.GetService<Service1>();
case 2:
return serviceProvider.GetService<Service2>();
default:
throw new Exception("Not valid key");
}
});