Тож я створював рівень доступу до даних за допомогою TDD і дещо викликав занепокоєння. Я б краще не починав неправильний шлях, тому я подумав, що попрошу вас, хлопці, дізнатись, чи мої думки узгоджуються з чистою архітектурою.
Методи в моєму шарі доступу до даних (DAL коротко) досить прості. Вони відповідають збереженим процедурам у базі даних (іншого способу зателефонувати в неї, щоб зберегти чистоту), і вони містять ті самі параметри, що і процедури. Потім вони просто підключаються до бази даних і повертають результат запиту. Ось один приклад:
public int DeleteRecord(int recordId)
{
recordId.RequireThat("recordId").NotZeroOrLess();
List<SqlParameter> parameters = new List<SqlParameter>();
parameters.Add(new SqlParameter { ParameterName = "@RecordId", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = recordId});
return this.ExecuteNonQuery("DeleteRecord", parameters.ToArray());
}
Це ідеально підходить для цього типу методів, оскільки я не роблю нічого значимого з набором результатів. Я просто хочу переконатися, що команда працювала, тому я поверну результат не запиту, який стосується лише рядків, і я можу перевірити логіку за допомогою цього числа.
Однак, скажімо, в іншому методі DAL, я хочу завантажити запис. Моя процедура завантаження буде виконуватись selects
над купою таблиць і повертати a DataSet
, але я борюся з тим, чи повинен мій DAL створювати бізнес-об'єкти в рамках методу, використовуючи метод DataSet
, або якщо мої бізнес-об'єкти повинні просто мати Load()
метод, який отримує DataSet
від DAL, а потім в основному заповнює себе.
Якщо це зробити через DAL, це призведе до меншої логіки в бізнес-об'єктах (навіть якщо це лише логіка вибору, це все-таки логіка), але трохи натовпить DAL і дасть йому відчуття, ніби він справді робить щось, чого не повинен ' не робити.
Як ви думаєте, хлопці?