Adapter para conexão com o PostGres
PM > Install-Package Marraia.Postgres
Primeiro passo é adicionar a string de conexão de seu banco de dados Postgres em seu arquivo de configuração appsettings.json
"Connection": "Data Source=localhost;Initial Catalog=TesteDb;User Id=sa;Password=123Aa321;"
Nesta biblioteca comtempla o uso do ORM Dapper. Você pode utilizar para se conectar em seu banco de dados.
No arquivo Startup.cs de sua aplicação adicione no método ConfigureServices o middleware em específico:
public void ConfigureServices(IServiceCollection services)
{
..
..
services.AddDapperPostgres(Configuration.GetSection("Connection").Value);
}
Na interface de repositório de sua classe de domínio, precisaremos da herança da interface IRepositoryBase<ClassDomain, PrimaryKey> Onde ClassDomain informe sua classe de domínio Onde PrimaryKey informe o tipo da identificação do objeto no Postgres
public interface IPersonRepository : IRepositoryBase<Person, int>
{
}
Em seu repositório use a herança da classe RepositoryBase<ClassDomain, PrimaryKey>. Onde ClassDomain informe sua classe de domínio Onde PrimaryKey informe o tipo da identificação do objeto no Postgres
public class PersonRepository : RepositoryBase<Person, int>, IPersonRepository
{
public PersonRepository(IDbConnection connection,
ITransactionBase transactionBase)
: base (connection, transactionBase)
{
}
}
A interface ITransactionBase, é responsavel pelo controle de transação, caso você utilize transação em seus comandos. Veremos como fazer isso no tópico Transação.
Com essa herança, você terá os métodos:
- InsertAsync(ClassDomain)
- UpdateAsync(ClassDomain)
- DeleteAsync(PrimaryKey)
- GetByIdAsync(PrimaryKey)
- GetAllAsync()
Caso necessite você poderá fazer a sobrescrita dos métodos da classe base RepositoryBase<ClassDomain, PrimaryKey>
public class PersonRepository : RepositoryBase<Person, int>, IPersonRepository
{
public PersonRepository(IDbConnection connection,
ITransactionBase transactionBase)
: base(connection, transactionBase)
{
}
public override Task InsertAsync(Person entity)
{
return _connection
.ExecuteAsync("INSERT INTO PERSON VALUES (@name, @surname)", entity);
}
public override Task<Person> GetByIdAsync(int id)
{
return base.GetByIdAsync(id);
}
}
Perceba, que para obter a conexão com o Postgres, existe a propriedade _connection, que já está injetada com a sua classe de domínio.
Caso você precise controlar transação em seu projeto, segue um exemplo da utilização com o design de Unit of Work. Faça a inversão de controle da interface IUnitOfWork, que já está injetada em seu projeto conforme tópico Dapper - Injetar o uso do Dapper em sua aplicação
public class PersonAppService : IPersonAppService
{
readonly IPersonRepository _personRepository;
readonly IUnitOfWork _unitOfWork;
public PersonAppService(IPersonRepository personRepository,
IUnitOfWork unitOfWork)
{
_personRepository = personRepository;
_unitOfWork = unitOfWork;
}
public async Task InsertAsync()
{
using (transaction = _unitofWork.BeginTransaction())
{
try
{
await _personRepository
.InsertAsync(new Person("Fernando", "Abreu Mendes"))
.ConfigureAwait(false);
transaction.Commit();
}
catch(Exception ex)
{
transaction.Rollback();
}
}
}
}