Должен ли я отделять работу базы данных от фактического построения объектов (тематических объектов и их списков членов и словарей)?
Определенно, да.Два ваших блока кода внутри using (var reader =
достаточно сложны, так что (1) ваш метод GetData
выглядит уродливо, (2) вы хотите выполнить модульные тесты для этого кода, и (3) вы хотите повторно использовать этот код при переключении надругая система баз данных, например, MySQL.
Как мне это сделать?Есть ли подходящий шаблон проектирования для такого случая?
Просто извлеките два кодовых блока из метода GetData
куда-нибудь еще.Так как ваш класс InitialTopic
довольно чистый, вы можете перейти сюда.Но вам решать.
Теперь единственная проблема заключается в том, как класс InitialTopic
получает данные от двух читателей.Конечно, мы передадим читателей объекту initialTopic
.Но мы не должны допустить, чтобы класс InitialTopic
зависел от класса базы данных (типа ваших читателей).
Обычно для решения этой проблемы мы применяем принцип инверсии зависимости.Введен новый интерфейс для абстрагирования операций читателей:
interface MyReader {
// hasNext() and next() methods, right?
}
Мы позволим классу InitialTopic
зависеть от интерфейса MyReader
.
Теперь мы напишем адаптер для адаптацииЧитатели Npgsql (читатели в using (var reader =
):
class MyNpgsqlReader : MyReader {
// use Dependency Injection to inject the Npgsql reader
}
Наконец, два кодовых блока в методе GetData
становятся:
using (var reader = resultSet1.ExecuteReader()) {
initialTopic.method1(new MyNpgsqlReader(reader));
}
...
using (var reader = resultSet2.ExecuteReader()) {
initialTopic.method2(new MyNpgsqlReader(reader));
}