Если мы посмотрим на шаблоны проектирования корпоративных приложений, то методы извлечения пользователей, т. Е. GetUserByID и GetAllUsers, будут находиться в отдельном классе - вы можете назвать его UserData или UserDAO (DAO - объект доступа к данным).
На самом деле вы должны разработать интерфейс для UserDAO с соответствующими методами для обработки пользовательских объектов - такими как CreateUser, UpdateUser, DeleterUser, GetUserXXX и т. Д.
Должна быть реализация UserDAO в соответствии с источником данных, например, если ваши пользователи хранятся в базе данных, вы можете реализовать логику доступа к базе данных при реализации UserDAO.
Ниже приведены преимущества хранения методов доступа в отдельном классе:
1) Пользовательский объект должен быть простым объектом с использованием только методов-установщиков геттеров, это облегчит передачу объекта между уровнями - от уровня доступа к данным до бизнес-уровня и веб-уровня. Это также поможет сохранить сериализацию User Object
2) Логика доступа к данным слабо связана с объектом User - это означает, что если источник данных изменяется, вам не нужно изменять сам объект User. Это также помогает в разработке через тестирование, где вам может понадобиться фиктивные объекты на этапе тестирования
3) Если объект «Пользователь» является сложным объектом с отношениями с другими объектами, такими как «Адрес», «Отдел», «Роль» и т. Д., То сложность отношений будет заключена в UserDAO, а не в утечку в объекте «Пользователь».
4) Портирование на фреймворки, такие как NHibernate или Spring.NET или .NET LINQ, станет проще, если следовать шаблонам