'ASP.NET Core Web App Error: Some services are not able to be constructed
This is my first question in StackOverFlow
Now, I'm using asp.net core 5.0 and I am trying to create database for Redis called Basket. But I encountered an Error.
This is the Error:
Unhandled exception. System.AggregateException: Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: Core.Interfaces.IBasketRepository Lifetime: Scoped ImplementationType: Infrastructure.Data.BasketRepository': Unable to resolve service for type 'StackExchange.Redis.IConnectionMultiplexer' while attempting to activate 'Infrastructure.Data.BasketRepository'.)
---> System.InvalidOperationException: Error while validating the service descriptor 'ServiceType: Core.Interfaces.IBasketRepository Lifetime: Scoped ImplementationType: Infrastructure.Data.BasketRepository': Unable to resolve service for type 'StackExchange.Redis.IConnectionMultiplexer' while attempting to activate 'Infrastructure.Data.BasketRepository'.
---> System.InvalidOperationException: Unable to resolve service for type 'StackExchange.Redis.IConnectionMultiplexer' while attempting to activate 'Infrastructure.Data.BasketRepository'.
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateArgumentCallSites(Type serviceType, Type implementationType, CallSiteChain callSiteChain, ParameterInfo[] parameters, Boolean throwIfCallSiteNotFound)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.CreateConstructorCallSite(ResultCache lifetime, Type serviceType, Type implementationType, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.TryCreateExact(ServiceDescriptor descriptor, Type serviceType, CallSiteChain callSiteChain, Int32 slot)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.CallSiteFactory.GetCallSite(ServiceDescriptor serviceDescriptor, CallSiteChain callSiteChain)
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.ValidateService(ServiceDescriptor descriptor)
--- End of inner exception stack trace ---
at Microsoft.Extensions.DependencyInjection.ServiceLookup.ServiceProviderEngine.ValidateService(ServiceDescriptor descriptor)
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable`1 serviceDescriptors, IServiceProviderEngine engine, ServiceProviderOptions options)
--- End of inner exception stack trace ---
at Microsoft.Extensions.DependencyInjection.ServiceProvider..ctor(IEnumerable`1 serviceDescriptors, IServiceProviderEngine engine, ServiceProviderOptions options)
at Microsoft.Extensions.DependencyInjection.ServiceCollectionContainerBuilderExtensions.BuildServiceProvider(IServiceCollection services, ServiceProviderOptions options)
at Microsoft.Extensions.DependencyInjection.DefaultServiceProviderFactory.CreateServiceProvider(IServiceCollection containerBuilder)
at Microsoft.Extensions.Hosting.Internal.ServiceFactoryAdapter`1.CreateServiceProvider(Object containerBuilder)
at Microsoft.Extensions.Hosting.HostBuilder.CreateServiceProvider()
at Microsoft.Extensions.Hosting.HostBuilder.Build()
at API.Program.Main(String[] args) in C:\projects\angular\Ecommerce\API\Program.cs:line 16
at API.Program.<Main>(String[] args)
watch : Exited with error code -532462766
watch : Waiting for a file to change before restarting dotnet...
Basket Repository
namespace Infrastructure.Data
{
public class BasketRepository : IBasketRepository
{
private readonly IDatabase _database;
public BasketRepository(IConnectionMultiplexer redis)
{
_database = redis.GetDatabase();
}
public async Task<bool> DeleteBasketAsync(string basketId)
{
return await _database.KeyDeleteAsync(basketId);
}
public async Task<CustomerBasket> GetBasketAsync(string basketId)
{
var data = await _database.StringGetAsync(basketId);
return data.IsNullOrEmpty ? null : JsonSerializer.Deserialize<CustomerBasket>(data);
}
public async Task<CustomerBasket> UpdateBasketAsync(CustomerBasket basket)
{
var created = await _database.StringSetAsync(basket.Id, JsonSerializer.Serialize(basket),
TimeSpan.FromDays(30));
if (!created) return null;
return await GetBasketAsync(basket.Id);
}
}
}
This is my ApplicationServicesExtensions Class
public static class ApplicationServicesExtensions
{
public static IServiceCollection AddApplicationServices(this IServiceCollection services)
{
services.AddScoped<IProductRepository, ProductRepository>();
services.AddScoped<IBasketRepository, BasketRepository>();
services.AddScoped(typeof(IGenericRepository<>), (typeof(GenericRepository<>)));
services.Configure<ApiBehaviorOptions>(options =>
{
options.InvalidModelStateResponseFactory = actionContext =>
{
var errors = actionContext.ModelState
.Where(e => e.Value.Errors.Count > 0)
.SelectMany(x => x.Value.Errors)
.Select(x => x.ErrorMessage).ToArray();
var errorResponse = new ApiValidationErrorResponse
{
Errors = errors
};
return new BadRequestObjectResult(errorResponse);
};
});
return services;
}
}
I added the following method inside the startup class
services.AddSingleton<ConnectionMultiplexer>(c => {
var configuration = ConfigurationOptions.Parse(_config.GetConnectionString("Redis"), true);
return ConnectionMultiplexer.Connect(configuration);
});
Most likely problem is in the constructor but How can I fix this problem? Thanks a lot!
Solution 1:[1]
You must register interface IConnectionMultiplexer
after that, you can inject into your repository class
replace this line to your startup class
services.AddSingleton<IConnectionMultiplexer ,ConnectionMultiplexer>(c => {
var configuration = ConfigurationOptions.Parse(_config.GetConnectionString("Redis"), true);
return ConnectionMultiplexer.Connect(configuration);
});
Solution 2:[2]
You Must register the interface of IConnectionMultiplexer
itself, not the implementation Class
replace this line in your startup class
services.AddSingleton<IConnectionMultiplexer>(c => {
var configuration = ConfigurationOptions.Parse(_config.GetConnectionString("Redis"), true);
return ConnectionMultiplexer.Connect(configuration);
});
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
Solution | Source |
---|---|
Solution 1 | behroozbc |
Solution 2 |