Я разрабатываю сервис для операций 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
}
И я мог бы связать конструкторы для каждой возможной комбинации, но это сделало бы ее очень раздутой, на мой взгляд.
Теперь мои вопросы:
Есть ли лучший метод для этого?
Разве я не должен использовать интерфейс для начала?
Не следует ли мне беспокоиться о раздутом конструкторе?
Есть ли другой / лучший способ сделать это в первую очередь?