public MachineState Lock(MachineId machineId, string userName) { lock (_lock) { if (string.IsNullOrEmpty(userName)) { throw new ArgumentException($"{nameof(userName)} is null or empty!"); } if (!_stateDictionary.ContainsKey(machineId)) { Add(machineId); } MachineState state = _stateDictionary[machineId]; if (state.IsLocked()) { throw new InvalidOperationException($"machine {machineId} has already ben locked!"); } MachineState newState = MachineState.ForLocked(machineId, userName); _stateDictionary[machineId] = newState; return(newState); } }