コード例 #1
0
        internal CacheShardMap AddOrUpdate(IStoreShardMap ssm)
        {
            CacheShardMap csm          = new CacheShardMap(ssm);
            CacheShardMap csmOldByName = null;
            CacheShardMap csmOldById   = null;

            if (_shardMapsByName.TryGetValue(ssm.Name, out csmOldByName))
            {
                _shardMapsByName.Remove(ssm.Name);
            }

            if (_shardMapsById.TryGetValue(ssm.Id, out csmOldById))
            {
                _shardMapsById.Remove(ssm.Id);
            }

            // Both should be found or none should be found.
            Debug.Assert((csmOldByName == null && csmOldById == null) ||
                         (csmOldByName != null && csmOldById != null));

            // Both should point to same cached copy.
            Debug.Assert(Object.ReferenceEquals(csmOldByName, csmOldById));

            if (csmOldByName != null)
            {
                csm.TransferStateFrom(csmOldByName);

                // Dispose off the old cached shard map
                csmOldByName.Dispose();
            }

            _shardMapsByName.Add(ssm.Name, csm);

            _shardMapsById.Add(ssm.Id, csm);
            return(csm);
        }