private int _previousRequestId;   // RequestId from the previous response

        // constructors
        public CommandUsingCommandMessageWireProtocol(
            ICoreSession session,
            ReadPreference readPreference,
            DatabaseNamespace databaseNamespace,
            BsonDocument command,
            IEnumerable <Type1CommandMessageSection> commandPayloads,
            IElementNameValidator commandValidator,
            BsonDocument additionalOptions,
            CommandResponseHandling responseHandling,
            IBsonSerializer <TCommandResult> resultSerializer,
            MessageEncoderSettings messageEncoderSettings,
            Action <IMessageEncoderPostProcessor> postWriteAction,
            ServerApi serverApi)
        {
            if (responseHandling != CommandResponseHandling.Return &&
                responseHandling != CommandResponseHandling.NoResponseExpected &&
                responseHandling != CommandResponseHandling.ExhaustAllowed)
            {
                throw new ArgumentException("CommandResponseHandling must be Return, NoneExpected or ExhaustAllowed.", nameof(responseHandling));
            }

            _session                = Ensure.IsNotNull(session, nameof(session));
            _readPreference         = readPreference;
            _databaseNamespace      = Ensure.IsNotNull(databaseNamespace, nameof(databaseNamespace));
            _command                = Ensure.IsNotNull(command, nameof(command));
            _commandPayloads        = commandPayloads?.ToList(); // can be null
            _commandValidator       = Ensure.IsNotNull(commandValidator, nameof(commandValidator));
            _additionalOptions      = additionalOptions;         // can be null
            _responseHandling       = responseHandling;
            _resultSerializer       = Ensure.IsNotNull(resultSerializer, nameof(resultSerializer));
            _messageEncoderSettings = messageEncoderSettings;
            _postWriteAction        = postWriteAction; // can be null
            _serverApi              = serverApi;       // can be null

            if (messageEncoderSettings != null)
            {
                _documentFieldDecryptor = messageEncoderSettings.GetOrDefault <IBinaryDocumentFieldDecryptor>(MessageEncoderSettingsName.BinaryDocumentFieldDecryptor, null);
                _documentFieldEncryptor = messageEncoderSettings.GetOrDefault <IBinaryCommandFieldEncryptor>(MessageEncoderSettingsName.BinaryDocumentFieldEncryptor, null);
            }
        }
 // constructors
 public CommandMessageFieldDecryptor(IBinaryDocumentFieldDecryptor documentFieldDecryptor, MessageEncoderSettings messageEncoderSettings)
 {
     _documentFieldDecryptor = documentFieldDecryptor;
     _messageEncoderSettings = messageEncoderSettings;
 }