Является ли класс помощника кеша кандидатом для одноэлементного шаблона? - PullRequest
2 голосов
/ 20 апреля 2011

Недавно я скачал несколько примеров для использования с кэшированием AppFabric. Я заметил, что в примере они использовали класс со статическими методами вместо синглтона.

Я думал о том, чтобы заменить его на синглтон по следующим причинам:

  1. ленивая нагрузка
  2. Только один экземпляр кэша ... Я не могу вспомнить причину, по которой требуется более одного экземпляра.

Я далеко от цели или прямо на деньги?

Ниже приведен класс, который они включили:

public class CacheUtil
{
  private static DataCacheFactory _factory = null;
  private static DataCache _cache = null;
  public static DataCache GetCache()
  {
      if (_cache != null)
          return _cache;

      //-------------------------
      // Configure Cache Client 
      //-------------------------

      //Define Array for 1 Cache Host
      List<DataCacheServerEndpoint> servers = 
          new List<DataCacheServerEndpoint>(1);

      //Specify Cache Host Details 
      //  Parameter 1 = host name
      //  Parameter 2 = cache port number
      servers.Add(new DataCacheServerEndpoint("localhost", 22233));

      //Create cache configuration
      DataCacheFactoryConfiguration configuration = 
          new DataCacheFactoryConfiguration();

      //Set the cache host(s)
      configuration.Servers = servers;

      //Set default properties for local cache (local cache disabled)
      configuration.LocalCacheProperties = 
          new DataCacheLocalCacheProperties();

      //Disable tracing to avoid informational/verbose messages on the web page
      DataCacheClientLogManager.ChangeLogLevel(System.Diagnostics.TraceLevel.Off);

      //Pass configuration settings to cacheFactory constructor
      _factory = new DataCacheFactory(configuration);

      //Get reference to named cache called "default"
      _cache = _factory.GetCache("default");

    return _cache;
  }

Ответы [ 3 ]

2 голосов
/ 22 апреля 2011

Да. Это легко реализовать:

    public class CacheUtil
    {
        private static DataCacheFactory _factory = null;
        private static DataCache _cache = null;

        // This is the single instance of this class
        private static readonly CacheUtil instance = new CacheUtil();

        private CacheUtil()
        {
            _cache = GetCache();
        }        

        /// <summary>
        /// Provides the single reference point to access this class
        /// </summary>
        public static CacheUtil Instance
        {
            get { return instance; }
        }

        private static DataCache GetCache()
        {
            if (_cache != null)
                return _cache;

            //-------------------------
            // Configure Cache Client 
            //-------------------------

            //Define Array for 1 Cache Host
            List<DataCacheServerEndpoint> servers =
                new List<DataCacheServerEndpoint>(1);

            //Specify Cache Host Details 
            //  Parameter 1 = host name
            //  Parameter 2 = cache port number
            servers.Add(new DataCacheServerEndpoint("localhost", 22233));

            //Create cache configuration
            DataCacheFactoryConfiguration configuration = new DataCacheFactoryConfiguration { 
Servers = servers, 

LocalCacheProperties = new DataCacheLocalCacheProperties() };

            //Disable tracing to avoid informational/verbose messages on the web page
            DataCacheClientLogManager.ChangeLogLevel(System.Diagnostics.TraceLevel.Off);

            //Pass configuration settings to cacheFactory constructor
            _factory = new DataCacheFactory(configuration);

            //Get reference to named cache called "default"
            _cache = _factory.GetCache("default");

            return _cache;
        }
        /// <summary>
        /// Gets the cache
        /// </summary>
        public DataCache Cache { get; private set; }
    }
2 голосов
/ 20 апреля 2011

Я бы сказал, да, я использую одноэлементный шаблон для кэша в нашем веб-приложении (против нашего собственного интерфейса кэша)

1 голос
/ 20 апреля 2011

Я не понимаю, почему вы хотите изменить класс, который выглядит как статическая фабрика, на Singleton. Он также выполняет отложенную загрузку, и не будет более одного экземпляра.

РЕДАКТИРОВАТЬ

Фабричный подход еще лучше в том, что он возвращает интерфейс (по крайней мере, я так думаю), поэтому он может изменить свою реализацию в более поздних выпусках, не нарушая клиентский код.

...