Прежде всего, Xaqron делает замечание, что то, о чем вы говорите, вероятно, не квалифицируется как кеширование.Это действительно просто глобально доступная переменная с ленивой загрузкой.Это хорошо: как практический программист, нет смысла отклоняться назад для реализации полного кэширования, где это не очень полезно.Однако, если вы собираетесь использовать этот подход, вы также можете быть Lazy
и позволить .NET 4 сделать тяжелую работу:
private static Lazy<IEnumerable<Category>> _allCategories
= new Lazy<IEnumerable<Category>>(() => /* Db call to populate */);
public static IEnumerable<Category> AllCategories
{
get { return _allCategories.Value; }
}
Я позволил себе сменить тип на IEnumerable<Category>
чтобы вызывающие абоненты не думали, что они могут добавить в этот список.
Тем не менее, каждый раз, когда вы получаете доступ к общедоступному статическому члену, вы упускаете большую гибкость, необходимую для объектно-ориентированного программирования.предлагает.Я лично рекомендую вам:
- Переименовать класс в CategoryRepository (или что-то подобное),
- Сделать этот класс реализующим интерфейс
ICategoryRepository
, с GetAllCategories()
метод интерфейса и - Интегрируйте этот интерфейс в конструктор любых классов, которые в этом нуждаются.
Этот подход позволит вам использовать классы модульного тестирования, которые должнывыполнять действия со всеми категориями, с полным контролем над тем, какие «категории» тестируются, и без необходимости вызова базы данных.