/// <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)); }
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; }