Мой вопрос в том, каков наилучший способ продвинуться вперед в этом дизайне.
Классы с именами Util
или Manager
, или какой у вас вообще запах дизайнаВы должны быть в состоянии описать, что делает класс (он должен нести единственную ответственность), и это должно быть именем класса.Если вам нужно использовать общие, расплывчатые, всеобъемлющие термины для описания того, что делает класс, значит, вы делаете что-то не так, и вам нужно выполнить редизайн.
Ваш Util
класс делает слишком много.Он получает данные из базы данных для двух разных типов.Разрабатывая свой класс таким образом, вы настраиваете себя на нарушение принципа открытия / закрытия (вам придется изменять этот класс каждый раз, когда вы добавляете новый тип в вашу модель).
Как минимум,вам нужны отдельные классы для получения Foo
s и NotRelatedToFoo
s из базы данных.Как насчет
abstract class Repository<T> {
IEnumerable<T> GetAll();
}
abstract class SqlRepository<T> : Repository<T> {
protected readonly SqlConnection connection;
public SqlRepository(SqlConnection connection) {
this.connection = connection;
}
}
class FooRepository : SqlRepository<T> {
public FooRepository(SqlConnection connection) : base(connection) { }
public IEnumerable<T> GetAll() {
}
}
и т. Д.Что действительно прискорбно, так это то, что вы можете даже поднять много повторяющегося кода гидратации объекта из IDataReader
в общий класс (подсказка: первая версия будет использовать отражение).
Помимо этого, прочитайте о SOLID .А если вы действительно хотите погрузиться в это, попробуйте Шаблоны архитектуры корпоративных приложений (Фаулер) и Шаблоны проектирования (Гамма и др.)