Эй, я искал решение сложной проблемы, которую мы имеем с нашей кодовой базой.
Для начала наш код напоминает следующее:
class User
{
int id;
int accountId;
Account account
{
get { return Account.Get(accountId); }
}
}
class Account
{
int accountId;
OnlinePresence Presence
{
get { return OnlinePresence.Get(accountId); }
}
public static Account Get(int accountId)
{
// hits a database and gets back our object.
}
}
class OnlinePresence
{
int accountId;
bool isOnline;
public static OnlinePresence Get(int accountId)
{
// hits a database and gets back our object.
}
}
То, что мы часто делаем в нашем коде, это попытка получить доступ к учетной записи Присутствие пользователя, выполнив
var presence = user.Account.Presence;
Проблема в том, что это фактически делает два запроса к базе данных. Один для получения объекта Account, а другой для получения объекта Presence. Мы могли бы легко свести это к одному запросу, если бы мы сделали следующее:
var presence = UserPresence.Get(user.id);
Это работает, но отчасти требует, чтобы разработчики понимали класс / методы UserPresence, которые было бы неплохо устранить.
Я подумал о нескольких классных способах справиться с этой проблемой, и мне было интересно, знает ли кто-нибудь, возможны ли они, есть ли другие способы справиться с этим, или нам просто нужно больше думать как мы кодируем и делаем UserPresence.Get вместо использования свойств.
Перегрузка вложенных аксессоров.
Было бы здорово, если бы внутри класса User я мог бы написать какое-то «расширение», которое бы сообщало: «каждый раз, когда к объекту Presence объекта User присваивается доступ, используйте это вместо этого».
Перегрузка. оператор со знанием того, что будет после.
Если бы я мог как-то перегрузить. Оператор только в ситуациях, когда объект справа также «пунктирный», было бы здорово.
Обе эти вещи кажутся вещами, которые могут быть обработаны во время компиляции, но, возможно, я что-то упускаю (размышление затруднит это?). Я смотрю на вещи совершенно неправильно? Есть ли способ применить это, чтобы снять нагрузку с пользователя на бизнес-логику?
Спасибо!
Тим