Ejemplo n.º 1
0
        private IOriginReader CreateFilesystemReader(Uri uri)
        {
            var context = FilesystemUtils.CreateContext(uri);

            return(new OriginReader(
                       Trace(
                           Count(
                               new FilesystemObjectSource(context),
                               "origin.fs")),
                       Robust(
                           Trace(
                               Count(
                                   new FilesystemObjectReader(context),
                                   "fs")))));
        }
        private IDestinationWriter CreateFilesystemWriter(string address, string?recycleAddress, Uri uri)
        {
            var context = FilesystemUtils.CreateContext(uri);
            FilesystemContext?recycleContext;

            if (recycleAddress is object)
            {
                if (!Uri.TryCreate(recycleAddress, UriKind.Absolute, out var recycleUri))
                {
                    throw new ArgumentOutOfRangeException(nameof(address), "Invalid filesystem recycle address.");
                }

                recycleContext = FilesystemUtils.CreateContext(recycleUri);
            }
            else
            {
                recycleContext = null;
            }

            const byte FilesystemRetries = 10;
            var        lockName          = FormattableString.Invariant($"{Environment.ProcessId}_{Guid.NewGuid():N}");

            return(new DestinationWriter(
                       address,
                       Trace(
                           Count(
                               new FilesystemObjectSource(context),
                               "destination.fs"),
                           "destination"),
                       Trace(
                           Count(
                               new FilesystemObjectWriter(context, recycleContext),
                               "fs")),
                       Lock(
                           Cache(
                               Retry(
                                   Trace(
                                       new FilesystemObjectWriterLocker(context, lockName)),
                                   FilesystemRetries)))));
        }