У меня есть абстрактный класс с именем DatabaseRow
, который после создания и создания в основном загружается из Load (идентификатор объекта)
метод
У меня есть много кода, который создает новый экземпляр класса, загружает его из идентификатора, а затем возвращает класс. Я хотел бы упростить этот код до одной строки кода (на всякий случай, существует множество классов, которые будут иметь только списки свойств, возвращающих эти загруженные экземпляры).
Есть два способа, которые я могу придумать для выполнения это, но ни то, ни другое не кажется мне «правильным».
1. Я мог бы вернуть это;
в конце моего метода Load
и использовать return new Derived (). Load (id);
2. Я мог бы создать общий метод для возврата загруженного метода.
public static T LoadRow<T>(object id) where T : DatabaseRow, new()
{
T row = new T();
row.Load(id);
return row;
}
Я видел другой код, который использует тот же метод, что и номер 1 , но я никогда не видел, чтобы опытные разработчики рекомендовали это, и я не встречал никаких методов в платформе .NET, которые делают то же самое, так что, может быть, это не лучшая практика?
Кто-нибудь знает какие-либо другие решения, которые могли бы быть лучше, чем оба из них?
Решение:
Прочитав ответ и комментарий SirViver, я понял, что все возвращаемые свойства в любом случае необходимо кэшировать. Решение было несколько иным, но похоже на вариант 2 (что я не ожидал, что кто-то придумает такой ответ, как я » t объясните эту часть схемы)
Все эти экземпляры будут загружены из значения, полученного из другого столбца в базе данных (отношения базы данных, если хотите). Вместо того, чтобы пытаться загрузить новый экземпляр из этого значения, я создал метод для загрузки экземпляра из имени столбца и кеширования загруженного значения в Словаре. Это работает хорошо, так как это одна из основных функций класса DatabaseRow
.
private Dictionary<string, DatabaseRow> linkedRows;
protected T GetLinkedRow<T>(string key) where T : DatabaseRow, new()
{
if (linkedRows.ContainsKey(key)) return (T)linkedRows[key];
else
{
T row = new T();
row.Load(this[key]);
linkedRows.Add(key, row);
return row;
}
}