Como exemplo, vamos implementar um exemplo onde temos tanto uma camada DAL quanto classes DAO para diferentes entidades. A ideia é ter uma arquitetura organizada onde a DAL fornece a infraestrutura para acesso ao banco de dados e as classes DAO lidam com as operações específicas para cada entidade.
Arquivos do Projeto
Connection.cs
namespace ScreenSound5.Banco
{
using Microsoft.Data.SqlClient;
public class Connection
{
private readonly string _connectionString;
public Connection(string connectionString)
{
_connectionString = connectionString;
}
public SqlConnection ObterConexao()
{
return new SqlConnection(_connectionString);
}
}
}
DataAccessLayer.cs (DAL)
namespace ScreenSound5.Banco;
public class DataAccessLayer
{
private readonly Connection _connection;
public DataAccessLayer(Connection connection)
{
_connection = connection;
}
public IEnumerable<Artista> ListarArtistas()
{
var artistaDAO = new ArtistaDAO(_connection);
return artistaDAO.Listar();
}
public void AdicionarArtista(Artista artista)
{
var artistaDAO = new ArtistaDAO(_connection);
artistaDAO.Adicionar(artista);
}
public IEnumerable<Album> ListarAlbuns()
{
var albumDAO = new AlbumDAO(_connection);
return albumDAO.Listar();
}
public void AdicionarAlbum(Album album)
{
var albumDAO = new AlbumDAO(_connection);
albumDAO.Adicionar(album);
}
public IEnumerable<Musica> ListarMusicas()
{
var musicaDAO = new MusicaDAO(_connection);
return musicaDAO.Listar();
}
public void AdicionarMusica(Musica musica)
{
var musicaDAO = new MusicaDAO(_connection);
musicaDAO.Adicionar(musica);
}
}
}
ArtistaDAO.cs (DAO)
namespace ScreenSound5.Banco;
internal class ArtistaDAO
{
private readonly Connection _connection;
public ArtistaDAO(Connection connection)
{
_connection = connection;
}
public IEnumerable<Artista> Listar()
{
var lista = new List<Artista>();
using var connection = _connection.ObterConexao();
connection.Open();
SqlCommand command = new("SELECT * FROM ARTISTAS", connection);
using SqlDataReader dataReader = command.ExecuteReader();
while (dataReader.Read())
{
string nomeArtista = Convert.ToString(dataReader["Nome"])!;
int idArtista = Convert.ToInt32(dataReader["Id"])!;
string bioArtista = Convert.ToString(dataReader["Bio"])!;
string fotoPerfil = Convert.ToString(dataReader["FotoPerfil"])!;
Artista artista = new(nomeArtista, bioArtista, fotoPerfil) { Id = idArtista };
lista.Add(artista);
}
return lista;
}
public void Adicionar(Artista artista)
{
using var connection = _connection.ObterConexao();
connection.Open();
SqlCommand command = new("INSERT INTO Artistas (Nome, FotoPerfil, Bio) VALUES (@nome, @fotoPerfil, @bio)", connection);
command.Parameters.AddWithValue("@nome", artista.Nome);
command.Parameters.AddWithValue("@fotoPerfil", artista.FotoPerfil);
command.Parameters.AddWithValue("@bio", artista.Bio);
int retorno = command.ExecuteNonQuery();
Console.WriteLine($"Linhas afetadas: {retorno}");
}
}
}
AlbumDAO.cs (DAO)
namespace ScreenSound5.Banco;
internal class AlbumDAO
{
private readonly Connection _connection;
public AlbumDAO(Connection connection)
{
_connection = connection;
}
public IEnumerable<Album> Listar()
{
// code
}
MusicaDAO.cs (DAO)
namespace ScreenSound5.Banco;
internal class MusicaDAO
{
// code
}
Resumo
- DAL (Data Access Layer):
DataAccessLayer.cs
é uma camada que abstrai a interação com várias entidades do banco de dados. - DAO (Data Access Object):
ArtistaDAO.cs
,AlbumDAO.cs
,MusicaDAO.cs
são classes que lidam com as operações específicas de cada entidade.
Conclusão
Portanto, faz mais sentido nomearmos as classes que fazem consulta a entidades especificas para DAL, por exemplo: ArtistaDAO, MusicaDAO, EntidadeDoBDDAO, correto?