Open Closed

Unable to inject AmazonSQS #8536


User avatar
0
suresht created
  • ABP Framework version: v8.3.0
  • UI Type: Angular
  • Database System: EF Core (SQL Server)
  • Tiered (for MVC) or Auth Server Separated (for Angular): yes
  • Exception message and full stack trace:
* An exception was thrown while activating CastandCrew.Payroll.Timecard.CapsPay.v1.CapspaytimecardAppService -> CastandCrew.Payroll.Timecard.Queue.v1.AwsSqsHelper.
Autofac.Core.DependencyResolutionException: An exception was thrown while activating CastandCrew.Payroll.Timecard.CapsPay.v1.CapspaytimecardAppService -> CastandCrew.Payroll.Timecard.Queue.v1.AwsSqsHelper.
 ---> Autofac.Core.DependencyResolutionException: None of the constructors found on type 'CastandCrew.Payroll.Timecard.Queue.v1.AwsSqsHelper' can be invoked with the available services and parameters:
Cannot resolve parameter 'Amazon.SQS.IAmazonSQS sqsClient' of constructor 'Void .ctor(Amazon.SQS.IAmazonSQS)'.
  • Steps to reproduce the issue:
  • Following is the code in the AbpModule class:
[DependsOn(
    typeof(TimecardDomainModule),
    typeof(TimecardApplicationContractsModule),
    typeof(AbpDddApplicationModule),
    typeof(AbpAutoMapperModule)
    )]
public class TimecardApplicationModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        var configuration = context.Services.GetConfiguration();
        context.Services.AddAutoMapperObjectMapper<TimecardApplicationModule>();
        Configure<AbpAutoMapperOptions>(options =>
        {
            options.AddMaps<TimecardApplicationModule>(validate: true);
            options.AddProfile<TimecardApplicationAutoMapperProfile>(validate: true);
        });
        //Register an instance as singleton
        context.Services.AddSingleton<AmazonSQSClient>(new AmazonSQSClient());
        //Register a factory method that resolves from IServiceProvider
        context.Services.AddScoped<IAmazonSQS>(
            sp => sp.GetRequiredService<AmazonSQSClient>()
        );
    }
}

Following is the code for AwsSqsHelper class which injects IAmazonSQS:

    public class AwsSqsHelper : ApplicationService, IAwsSqsHelper
    {
        #region Class Variables

        private readonly ILogger<CapspaytimecardAppService> _logger;
        private readonly ISettingProvider _settingProvider;
        private readonly IAmazonSQS _sqsClient;

        #endregion

        #region Constructors

        public AwsSqsHelper(
            IAmazonSQS sqsClient)
        {
            _sqsClient = sqsClient;

            _logger = NullLogger<CapspaytimecardAppService>.Instance;
        }

        #endregion

        #region IAwsSqsHelper Implementation

        public async Task<bool> DeleteMessageAsync(string messageReceiptHandle)
        {
            *** Removed for brevity ***
        }

        public async Task<bool> IsQueueReady()
        {
            *** Removed for brevity ***
        }

        public async Task<List<Message>> ReceiveMessageAsync()
        {
            *** Removed for brevity ***
        }

        public async Task<bool> SendMessageAsync(
            string message,
            SqsMessageAttributes messageAttributes)
        {
            *** Removed for brevity ***
        }

        #endregion
    }

Following is the code for CapspaytimecardAppService:

    public class CapspaytimecardAppService : TimecardAppService, ITimecardAppService
    {
        #region Class Variables

        private readonly IAwsSqsHelper _awsSqsHelper;
        private readonly ICapspaytimecardManager _capsPayManager;
        private readonly ILogger<CapspaytimecardAppService> _logger;
        private readonly IObjectMapper _objectMapper;
        private readonly IStringLocalizer<TimecardResource> _stringLocalizer;

        #endregion

        #region Constructors

        public CapspaytimecardAppService(
            IAwsSqsHelper awsSqsHelper,
            IHttpClientFactory httpClientFactory,
            ICapspaytimecardManager capsPayManager,
            IObjectMapper objectMapper,
            IStringLocalizer<TimecardResource> stringLocalizer) : base(httpClientFactory)
        {
            _awsSqsHelper = awsSqsHelper;
            _capsPayManager = capsPayManager;
            _objectMapper = objectMapper;
            _stringLocalizer = stringLocalizer;

            _logger = NullLogger<CapspaytimecardAppService>.Instance;
        }

        internal CapspaytimecardAppService(
            IAwsSqsHelper awsSqsHelper,
            HttpClient httpClient,
            ICapspaytimecardManager capsPayManager,
            ILogger<CapspaytimecardAppService> logger,
            IObjectMapper objectMapper,
            IStringLocalizer<TimecardResource> stringLocalizer) : base(httpClient)
        {
            _awsSqsHelper = awsSqsHelper;
            _capsPayManager = capsPayManager;
            _logger = logger;
            _objectMapper = objectMapper;
            _stringLocalizer = stringLocalizer;
        }

        #endregion
        
            *** Removed for brevity ***
    }

The code was working until I introduced AmazonSQS implementation. Please let me know if you need additional information.

Thanks.


2 Answer(s)
  • User Avatar
    0
    liangshiwei created
    Support Team Fullstack Developer

    Hi,

    Your code looks to have no problem.

    Can you share a test project with me? I will check it.

    shiwei.liang@volosoft.com

  • User Avatar
    0
    suresht created

    Hi,

    I did more troubleshooting and fixed the issue:

    Replaced the following:
    context.Services.AddSingleton<AmazonSQSClient>(new AmazonSQSClient());
    
    with:
    context.Services.AddSingleton(new AmazonSQSClient(awsRegionEndpoint));
    

    Thanks for your assistance.

Boost Your Development
ABP Live Training
Packages
See Trainings
Mastering ABP Framework Book
The Official Guide
Mastering
ABP Framework
Learn More
Mastering ABP Framework Book
Made with ❤️ on ABP v10.0.0-preview. Updated on July 17, 2025, 06:22