Зачем нужен класс DB?
Меня учили что нужно использовать при работе с БД вот такой класс:
class DB
{
SqlConnection con = new SqlConnection("Строка подключения");
public void OpenConnection()
{
if (con.State == System.Data.ConnectionState.Closed)
con.Open();
}
public void CloseConnection()
{
if (con.State == System.Data.ConnectionState.Open)
con.Close();
}
public SqlConnection GetConnection()
{
return con;
}
public string ReturnFromDB(string s)
{
OpenConnection();
SqlCommand com = new SqlCommand(s, GetConnection());
SqlDataReader reader = com.ExecuteReader();
string x = "";
while (reader.Read())
{
x = reader[0].ToString();
}
reader.Close(); CloseConnection();
return x;
}
}
Вот так:
DB db = new DB();
db.OpenConnection();
SqlCommand com = new SqlCommand("Команда", db.GetConnection());
SqlDataReader reader = com.ExecuteReader();
List<string[]> data = new List<string[]>();
while (reader.Read())
{
data.Add(new string[1]);
data[data.Count - 1][0] = reader[0].ToString();
}
reader.Close();
db.CloseConnection();
Зачем он нужен если можно и без этого класса обойтись?
conn.Open();
NpgsqlCommand command = conn.CreateCommand();
command.CommandText = "Команда";
NpgsqlDataReader reader = command.ExecuteReader();
List<string[]> data = new List<string[]>();
while (reader.Read())
{
data.Add(new string[1]);
data[data.Count - 1][0] = reader[0].ToString();
}
reader.Close();
conn.Close();
Спрашивал у преподавателя, но нормального ответа не получил...
Можно ли как то код сократить?
Ответы (1 шт):
Сократить можно. Но не нужно.
Принцип единственной ответственности (буква S из SOLID). если это у тебя контроллер - он должен только получить результат из сервиса бизнес-логики и отдать его в нужном виде.
Если это сервис бизнес-логики - он не должен получать данные из базы, он должен получать их из класса-репозитория. Dependency inversion (буква D из SOLID) - реализация должна зависеть от абстракций. Неважно, откуда будут получены данные, важно то, что метод ReturnFromDb отдал строку.
Если у нас это всё завязано на класс (по хорошему, конечно, на интерфейс) DB - то мы можем спокойно сменить базу данных с MySql на Postgres, или вообще вынести получение данных во внешний сервис - и наш код, который использует данные из базы, никак не поменяется если не поменялся контракт.
Если мы всё - и чтение данных, и их обработку, и возврат результата потребителю - впихнём в один класс - это будет ужасный, страшный франкенштейн, с очень сильной связностью, который будет сложно поддерживать и сложно тестировать.