class UserDatastore : IUserDatastore
{
...
public IUser this[Guid userId]
{
get
{
User user = (from u in _dataContext.Users
where u.Id == userId
select u).FirstOrDefault();
return user;
}
}
...
}
Один из разработчиков в нашей команде утверждает, что индексатор в вышеуказанной ситуации не подходит и что метод GetUser(Guid id)
должен быть предпочтительным.
Аргументы таковы:
1) Мы не индексируем коллекцию в памяти, индексатор в основном выполняет скрытый запрос SQL
2) Использование Guid в индексаторе плохо (это также помечено FxCop)
3) Возврат null
из индексатора не нормальное поведение
4) Пользователь API обычно не ожидал бы такого поведения
Я согласен в определенной степени с (большинством) из этих пунктов.
Но я также склонен утверждать, что одной из характеристик Linq является абстрагирование доступа к базе данных, чтобы создать впечатление, что вы просто работаете с кучей коллекций, хотя парадигма отложенной оценки означает, что эти коллекции не нужны. оценивать, пока вы не выполните запрос к ним. Мне не кажется непоследовательным доступ к хранилищу данных таким же образом, как если бы это была конкретная коллекция в памяти.
Кроме того, учитывая, что это унаследованная кодовая база, которая широко и последовательно использует этот шаблон, стоит ли рефакторинг? Я согласен с тем, что, возможно, было бы лучше использовать метод Get с самого начала, но я еще не уверен, что использование индексатора совершенно неправильно.
Мне было бы интересно услышать все мнения, спасибо.