как настроить зависимости в ядре asp.net - PullRequest
1 голос
/ 27 сентября 2019

У меня есть приложение ASP.Net Core 2.1.Мне нужно зарегистрировать и ввести несколько зависимостей AWS.

. В настоящее время реализация выглядит следующим образом:

public abstract class BaseService
{
    protected readonly IConfiguration _configuration;
    protected readonly RegionEndpoint _region;
    protected readonly IAmazonDynamoDB _dynamoClient;
    protected  IPocoDynamo _pocoDynamo;

    public BaseService(IConfiguration configuration)
    {
        _configuration = configuration;
        var awsSettings = configuration.GetSection("AWS");
        _dynamoClient = SetDynamoClient(awsSettings);
        _pocoDynamo = SetPocoDynamoClient();
    }

    protected IAmazonDynamoDB SetDynamoClient(IConfigurationSection configuration)
    {
        AWSCredentials credentials = new BasicAWSCredentials(configuration["AccessKey"], configuration["AccessSecret"]);
        return new AmazonDynamoDBClient(credentials, _region);
    }

    protected IPocoDynamo SetPocoDynamoClient()
    {
        return new PocoDynamo(_dynamoClient);
    }
}

Во время модульного тестирования службы AWS не могут быть смоделированы из-за этого,

Я хочу зарегистрировать все эти зависимости в Startup.cs в ConfigureServices()

Это то, что я пытался:

public void ConfigureServices(IServiceCollection services)
{
    AWSCredentials credentials = new BasicAWSCredentials(configuration["AccessKey"], configuration["AccessSecret"]);

    services.AddTransient(IAmazonDynamoDB, (a) =>
         {
             return new AmazonDynamoDBClient(credentials, RegionEndpoint.GetBySystemName(""))
         });
    // here I need to pass the IAmazonDynamoDB to below IOC
    // services.AddSingleton<IPocoDynamo,new PocoDynamo()> ();

    return services;
}

Но это выдает ошибку

Ошибка CS0119 'IAmazonDynamoDB' - это тип, который недопустим в данном контексте

Как настроить зависимости, как здесь требуется?

Спасибо!

1 Ответ

1 голос
/ 27 сентября 2019

Используйте делегат фабрики для вызова зарегистрированной службы

public void ConfigureServices(IServiceCollection services) {
    AWSCredentials credentials = new BasicAWSCredentials(configuration["AccessKey"], configuration["AccessSecret"]);
    services.AddTransient<IAmazonDynamoDB>(sp => 
        new AmazonDynamoDBClient(credentials, RegionEndpoint.GetBySystemName(""))
    );

    //here pass the IAmazonDynamoDB to below IOC
    services.AddSingleton<IPocoDynamo>(serviceProvider => {
        var pocoDynamo = new PocoDynamo(serviceProvider.GetRequieredService<IAmazonDynamoDB>());
        pocoDynamo.SomeMethod();
        return pocoDynamo;
    });
}

Целевой класс больше не должен зависеть от IConfiguration, поскольку зависимости могут быть явно введены с помощью инжектора конструктора.

public abstract class BaseService {
    protected readonly IAmazonDynamoDB dynamoClient;
    protected readonly IPocoDynamo pocoDynamo;

    public BaseService(IAmazonDynamoDB dynamoClient, IPocoDynamo pocoDynamo) {        
        this.dynamoClient = dynamoClient;
        this.pocoDynamo = pocoDynamo;
    }
}
...