Интерфейс для удаленных файловых операций? - PullRequest
0 голосов
/ 25 сентября 2019

Я разрабатываю сервис для операций EDI между различными системами и клиентами и подумал, что было бы разумно использовать интерфейс для служб файловых операций на удаленных серверах.Скажем, один удаленный сервер использует SFTP, а другой FTP и другой FTP (и) и т. Д.

Методы, которые мне понадобятся для каждого случая, будут иметь один и тот же базовый набор: ListDirectory (), UploadFile (),DownloadFile () и т. Д. И мне нравится идея просто реализовать интерфейс на стороне клиента, и мне больше не нужно беспокоиться о реализации.

public interface IRemoteFileOperator
    {
        void CreateDirectory(string remotePath);
        void DeleteFile(string remotepath);
        void DeleteDirectory(string remotePath);
        void DownloadFile(string remotePath, string localPath);
        string[] ListDirectory(string remotePath);
        void UploadFile(string localPath, string remotePath);
    }

Теперь проблема, с которой я столкнулся, заключается в следующем:в то время как для класса SFTPServiceProvider это довольно просто, я борюсь с различными функциональными возможностями класса FTPServiceProvider.Скажем, я хочу использовать «Пассивный FTP» или включить SSL в конкретном случае?

Я не хочу писать свойства в интерфейсе, такие как «EnableSSL» и «UsePassive», поскольку другие сервисы, такие как SFTP, не будутподдерживать их, делая их бесполезными.

Мне также не нравится идея использовать их в конструкторе FTPServiceProvider, так как я чувствую, что они не являются строго "необходимыми", чтобы заставить его работать.Черт возьми, для анонимного FTP я буду в порядке только с именем хоста.

 public class FtpProvider : IRemoteFileOperator
    {     
        public FtpProvider(string serverUri, string user, string password)
        {
        //stuff
        }

        public FtpProvider(string serverUri, string user, string password, 
         bool useSSL, bool usePassive)
        {
        //stuff
        }

И я мог бы связать конструкторы для каждой возможной комбинации, но это сделало бы ее очень раздутой, на мой взгляд.

Теперь мои вопросы:

Есть ли лучший метод для этого?

Разве я не должен использовать интерфейс для начала?

Не следует ли мне беспокоиться о раздутом конструкторе?

Есть ли другой / лучший способ сделать это в первую очередь?

1 Ответ

0 голосов
/ 25 сентября 2019

Ваш подход в порядке.

Если вы не хотите писать много разных конструкторов, даже если это чистое решение с моей точки зрения, потому что вы можете определить, какие комбинации параметров допустимы, естьнесколько возможностей справиться с этим.

  1. Использовать необязательные параметры, которые могут уменьшить количество необходимых конструкторов, например:

    public FtpProvider(string serverUri, string user = null, string password = null, bool useSSL = false, bool usePassive = false)
    {
    //stuff
    }
    
  2. Exposeпараметры в качестве открытых полей, затем вы можете сделать следующее для инициализации объекта:

    var remoteFileOperator = new FtpProvider(ftpUri)
    {
        user = "user1",
        password = "12345"
    };
    
  3. Существуют и другие решения, такие как шаблон беглого компоновщика, который может быть удобно использовать, нотребуется гораздо больше реализации ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...