ASP. NET Core 3.1 IO C - вводить только некоторые параметры, передавать другие - PullRequest
0 голосов
/ 12 марта 2020

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

Идея такова:

  • Param - это параметр, который я передаю конструктору
  • Inject - это то, что IO C должен позаботиться о

Вызов класса будет выглядеть как

new ClassToCreate(param, param, inject)

В котором третий параметр - это тот, который я не хочу передавать.

Сценарий:

Я кратко опишу сценарий и то, как я до него дошел , так что возможно, у кого-то есть более разумное решение .

Я работаю над проектом, который взаимодействует с базой данных SQL, с единицей работы и шаблоном хранилища.

Небольшая выдержка из класса Единицы работы:

using Microsoft.Extensions.Configuration;
using System.Data;
using System.Data.SqlClient;

namespace MYPROJECT.ILIKETHISPROJECT.Dependencies.Repositories
{
    public sealed class UnitOfWork : IUnitOfWork
    {
        public IDbConnection connection { get; set; }
        public IDbTransaction transaction { get; set; }
        private IRegistryRepository registryRepository;
        private IConfiguration configuration;

    private bool disposed;

    public UnitOfWork(IConfiguration configuration)
    {
        connection = new SqlConnection(configuration.GetConnectionString("DefaultConnection"));
        connection.Open();
        transaction = connection.BeginTransaction();
        this.configuration = configuration;
    }

    //Recovers data from a table called Registry
    public IRegistryRepository registry
    {
        get => registryRepository ?? new RegistryRepository(this, configuration, INJECT ME!!!, INJECT ME TOO!!!!);
        set => registryRepository = value;
    }

    public void Commit()
    {
        //DO COMMIT
    }

    public void Rollback()
    {
       // DO ROLLBACK
    }

    private void ResetRepositories()
    {
        registry = null;
    }

    public void Dispose()
    {
        //DO DISPOSE (IDisposable interface requires both dispose signatures)
    }

    private void Dispose(bool disposing)
    {
        //DO DISPOSE
    }

    ~UnitOfWork()
    {
        Dispose(false);
    }
  }
}

Концентрат на

new RegistryRepository(this, configuration, INJECT ME!!!, INJECT ME TOO!!!!);

части. Здесь я должен передать юнито работы в хранилище и конфигурацию (потому что я получу некоторые параметры.

Теперь, конструкция RegistryRepository:

public RegistryRepository(IUnitOfWork unitOfWork, IConfiguration configuration, IDataProtectionProvider dataProtectionProvider, DataProtectionPurposeStrings dataProtectionPurposeStrings)

Класс для внедрения автоматически будет

  • IDataProtectionProvider dataProtectionProvider
  • DataProtectionPurposeStrings dataProtectionPurposeStrings

То, что они делают, - это шифрование / дешифрование некоторых строк, и моя цель - сохранить и зашифровать пароль в appsettings. json файл конфигурации NET. CORE 3.1 WebApi.

Идея возникла из этого видео на Youtube , в котором используется защита данных, включенная в ядро ​​net.

В основном мне нужно передать первые два параметра, и я бы хотел, чтобы IO C позаботился обо всем остальном.

Если это невозможно, мне придется изменить конструктор UnitOfWork следующим образом:

public UnitOfWork(IConfiguration configuration, IDataProtectionProvider dataProtectionProvider, DataProtectionPurposeStrings dataProtectionPurposeStrings)

А затем передать два экземпляра класса в RegistryRepository.

Есть ли лучший способ / идея сделать т его?

1 Ответ

0 голосов
/ 12 марта 2020

Вы можете использовать ActivatorUtilities.CreateInstance

//...

get => registryRepository ?? ActivatorUtilities.CreateInstance<RegistryRepository>(
    serviceProvider, this, configuration);

//...

, но вам потребуется встроенный поставщик услуг, который будет действовать как контейнер Io C для разрешения других параметров, которые не были предоставлено.

Однако я бы предложил переосмыслить ваш текущий дизайн по поводу инъекции IConfiguration, а также тесно увязать с конкретными проблемами реализации, такими как SqlConnection.

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

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