For me the hardest part has always been designing data access layer. After trying various strategies I started leaning towards many small focused DAOs like in example below. public class EmployeeService { public Task<EmployeeAnnualReport> GetEmployeeAnnualReportAsync(int id, IGetEmployeeAnnualReportDAO dataAccess) { Employee employee = await dataAccess.GetEmployeeAsync(id); // skipped for brevity } public async Task UpdateEmployeeAsync(int id, EmployeeUpdateInfo info, IUpdateEmployeeDAO dataA...