示例#1
0
 /// <summary>
 /// Build <see cref="IRelationalLockManager"/> instance.
 /// Especially, <see cref="RelationalLockManager"/> is created.
 /// </summary>
 /// <param name="configurator">configurator with relationships</param>
 /// <returns><see cref="IRelationalLockManager"/> instance</returns>
 public IRelationalLockManager Build(RelationalLockConfigurator configurator)
 {
     if (configurator == null)
     {
         throw new ArgumentNullException(nameof(configurator));
     }
     if (configurator.RelationCount < 1)
     {
         throw new ArgumentException("not registered key relations.", nameof(configurator));
     }
     return(new RelationalLockManager(configurator));
 }
示例#2
0
        internal RelationalLockManager(RelationalLockConfigurator configurator)
        {
            var infos        = configurator.GetInfos();
            var semaphoreMap = infos
                               .SelectMany(info => info.LockKeys)
                               .Distinct()
                               .ToDictionary(lockKey => lockKey, lockKey => new NamedSemaphore(lockKey));

            lockMap = infos.ToImmutableDictionary(
                info => info.Key,
                info => new LockContainer(info.Key, info.LockKeys.Select(key => semaphoreMap[key])));
            AvailableKeys   = lockMap.Keys.OrderBy(_ => _).ToImmutableArray();
            defaultTimeout  = configurator.DefaultTimeout;
            defaultExpireIn = configurator.DefaultExpireIn;
        }