2013-09-27 4 views
2

Я считаю, что это обычная ситуация, но не удалось найти удовлетворительный ответ с помощью Google.C# - альтернативы использованию перечислений как уникальных идентификаторов

Вопрос: Есть ли шаблон, который обращается к поиску значений перечисления из базы данных?

Ситуация: Мне поручили рефакторинг приложения Winforms, который становится очень тяжелым для использования в памяти. Основным виновником является проект «Константы» - в основном куча классов Enum. Их целью является дублирование значений таблицы поиска базы данных (см. Пример ниже).

public enum Status 
    { 
     None = -1, 
     Active = 0, 
     Completed = 1, 
     Review = 2, 
     Proceed = 3 
    } 

Все эти перечисления должны загружаться в память каждый раз, когда приложение загружается. Есть ли шаблон, который позволяет исправить эту проблему, но также не убивает базу данных с запросами?

+3

Интересный вопрос, +1. Я никогда не сталкивался с ситуацией, когда перечисления были виновниками большого объема использования памяти. Не могли бы вы поделиться тем, как вы пришли к такому выводу? – tnw

+5

Сколько у вас перечислений, что занимает столько памяти? – Anthony

+0

также, говоря о дублировании: вы можете удалить те полностью избыточные комментарии. – GolfWolf

ответ

1

Хотя довольно сложно поверить в то, что сборка enum s действительно может быть основным источником использования высокой памяти (я даже не хочу воображать РАЗМЕР этой сборки), в нее вовлекаются некоторые возможные решения:

  1. Изучение вашей памяти-жадность enum сборка для вещей, отличных от enum s. Да, это тривиальный совет, но он может оказаться самым разумным в конце концов.
  2. Сборка вашего enum сборок с главным проектом. В то время как enum s сами по себе мало потребляют памяти, связанная с ними большая сборка может быть само собой (из-за большого использования атрибутов, например).
  3. Выполнение необходимых значений с помощью набора необязательных классов static, заполненных пучком полей public static readonly int (не const). Вряд ли сократит использование памяти, если все они вызываются хотя бы один раз, но могут привести к некоторому снижению в зависимости от действий пользователя. Тем не менее, эти надоедливые int s сложнее объяснить за enum с.
  4. Внедрение необходимых значений с помощью кэшированного одноэлементного шаблона (возможно, для такого шаблона есть имя, но я не знаком с ним). Несмотря на то, что, очевидно, сложнее в памяти для каждого экземпляра, он позволяет (в зависимости от GC) внедряться в жизнь и отказываться от него на основе использования. В принципе, это должно быть что-то вроде

    internal abstract class ErzatsEnumBase { 
        protected static readonly ObjectCache Cache = MemoryCache.Default; 
        protected ErzatsEnumBase (string CacheKey, CacheItemPolicy CachePolicy) { 
         Cache.Add (CacheKey, this, CachePolicy, null); 
        } 
    } 
    public sealed class ErzatsEnum: ErzatsEnumBase { 
        private static CacheItemPolicy policy = new CacheItemPolicy() { 
         AbsoluteExpiration = ObjectCache.InfiniteAbsoluteExpiration, 
         SlidingExpiration = new TimeSpan (0, 15, 0) 
        }; 
        private ErzatsEnum (string CacheKey) 
         : base (CacheKey, policy) { 
        } 
        public ErzatsEnum Instance1 { 
         get { 
          ErzatsEnum result = ErzatsEnumBase.Cache.Get ("Instance1"); 
          if (result == null) 
           result = new ErzatsEnum ("Instance1"); 
          return result; 
         } 
        } 
        public ErzatsEnum Instance2 { 
         get { 
          ErzatsEnum result = ErzatsEnumBase.Cache.Get ("Instance2"); 
          if (result == null) 
           result = new ErzatsEnum ("Instance2"); 
          return result; 
         } 
        } 
    } 
    

Надежда некоторые из них оказались полезными :)

Смежные вопросы