public Compose()
            {
                var timeOfComposing = new DateTimeOffset(2020, 2, 24, 11, 20, 14, TimeSpan.FromHours(1));
                var expires         = TimeSpan.FromMinutes(5);
                var httpRequest     = new HttpRequestForSignatureString {
                    Method     = HttpMethod.Post,
                    RequestUri = "http://dalion.eu/api/resource/id1".ToUri()
                };
                var headerNames = new[] {
                    HeaderName.PredefinedHeaderNames.RequestTarget,
                    HeaderName.PredefinedHeaderNames.Date,
                    new HeaderName("dalion_app_id")
                };
                var requestTargetEscaping = RequestTargetEscaping.Unescaped;
                var nonce = "abc123";

                _compositionRequest = new SigningStringCompositionRequest {
                    Request               = httpRequest,
                    Expires               = expires,
                    Nonce                 = nonce,
                    HeadersToInclude      = headerNames,
                    RequestTargetEscaping = requestTargetEscaping,
                    TimeOfComposing       = timeOfComposing
                };

                FakeFactory.Create(out _headerAppender);
                A.CallTo(() => _headerAppenderFactory.Create(
                             _compositionRequest.Request,
                             _compositionRequest.RequestTargetEscaping,
                             _compositionRequest.TimeOfComposing,
                             _compositionRequest.Expires))
                .Returns(_headerAppender);
            }
        public string Compose(SigningStringCompositionRequest compositionRequest)
        {
            if (compositionRequest == null)
            {
                throw new ArgumentNullException(nameof(compositionRequest));
            }

            var headerAppender = _headerAppenderFactory.Create(
                compositionRequest.Request,
                compositionRequest.RequestTargetEscaping,
                compositionRequest.TimeOfComposing,
                compositionRequest.Expires);

            var sb = new StringBuilder();

            foreach (var headerName in compositionRequest.HeadersToInclude.Where(h => h != HeaderName.Empty))
            {
                sb = sb.Append(headerAppender.BuildStringToAppend(headerName));
            }

            sb.Append(_nonceAppender.BuildStringToAppend(compositionRequest.Nonce));

            return(sb.ToString().TrimStart());
        }