Я искал способ или шаблон, позволяющий передавать только некоторые параметры в класс и внедрять другие.
Идея такова:
- 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.
Есть ли лучший способ / идея сделать т его?