Внедрение зависимостей ядра .Net - с параметрами - PullRequest
0 голосов
/ 07 апреля 2019

ПРИМЕЧАНИЕ: этот пример был упрощен

Я получил таблицу контактов клиента и хотел получить конкретную контактную информацию клиента из БД. Код, который я набрал, любимый, приносит мне все контактные данные. Я хотел использовать параметр, чтобы принести мне только определенные клиентские контакты.

Я использовал такой интерфейс IClientContactRepository

public interface IClientContactRepository
{
    IQueryable<ClientContactModel> ClientContacts { get; }
}

И я использовал этот класс для извлечения данных из базы данных с помощью dapper

public class ClientContactRepository : IClientContactRepository
{
    private readonly IConfiguration configuration;
    private List<ClientContactModel> ClientContactList {get;set;}


    public ClientContactRepository(IConfiguration config)
    {
        configuration = config;

        SqlConnection conn = new SqlConnection(configuration["ConnectionString"]);

        using (var connection = conn)
        {
            ClientContactList = connection.Query<ClientContactModel>("Select * FROM ContactTable ").ToList();
        }
    }
    public IQueryable<ClientContactModel> ClientContacts => ClientContactList;
}

В моем классе запуска

  services.AddTransient<IClientContactRepository, ClientContactRepository>();

Мой ВОПРОС: можно ли передать параметр id клиента в конструктор.

Я попробовал это: добавить параметр в конструктор

  public ClientContactRepository(IConfiguration config, int clientId)

и попытался запустить класс.

 services.AddTransient<IClientContactRepository, ClientContactRepository(int,i)>()

не работал .... Может кто-нибудь помочь мне, как передать параметр, пожалуйста?

1 Ответ

3 голосов
/ 07 апреля 2019

Да, но откуда вы берете идентификатор клиента - это настроенное значение, которое будет статическим в течение всего срока службы приложения? Если это так, вы можете использовать перегрузку метода AddTansient, которая принимает делегат фабрики для создания объектов.

Лучший способ (охватит все варианты использования) - зарегистрировать тип, который может предоставить эту информацию (создать ее, если такого типа не существует), в контейнере DI и использовать ее в качестве параметра в конструкторе репозитория.

В качестве примера, скажем, вы получаете свой идентификатор клиента из заявки, поэтому тип, который вам нужно ввести, - IPrincipal:

services.AddScoped<IPrincipal>(
    provider => provider.GetService<IHttpContextAccessor>()
        .HttpContext
        .User);

Затем вы должны внедрить IPrincipal в конструктор репозитория и получить идентификатор клиента. Еще лучшим способом было бы создать свой собственный тип «ClientIdAccessor», который отвечает за предоставление идентификатора клиента. Тогда вы не будете зависеть от IPrincipal при тестировании вашего репозитория, и реализация этого нового типа будет зависеть только от внешних библиотек для вашей базовой реализации asp.net.

Примечание: вы уверены, что хотите использовать AddTransient для своего репо? Обычно вы хотите использовать один и тот же объект репо в течение срока действия запроса (т.е. AddScoped).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...