C # - статический метод или создание нового экземпляра при использовании сторонней библиотеки - PullRequest
0 голосов
/ 06 июня 2018

У меня есть класс, который реализует только стороннюю библиотеку - и я могу вам сказать, что это Google Cloud .

Мне интересно, когда я использую такие библиотеки, какиспользовать его правильно?

Вот мои примеры, показывающие, как я использую:

Новый экземпляр

Декларация

public class MyClass{
        private readonly string _jsonPath= ...;

        public readonly StorageClient Client;

        public MyClass()
        {
            var credential = GoogleCredential.FromFile(_jsonPath);
            Client = StorageClient.Create(credential);
        }

        public string Upload(/*my parameter*/)
        {
            Client.UploadObject(...);
            // etc
        }
}

Использование

var myInstance = new MyClass();

myInstance.Upload(...);

Статический метод

Декларация

public class MyClass{
        private static readonly string _jsonPath= ...;

        public static readonly StorageClient Client = StorageClient.Create(GoogleCredential.FromFile(_jsonPath));

        public static string Upload(/*my parameter*/)
        {
            Client.UploadObject(...);
            // etc
        }
}

Использование

MyClass.Upload(...);

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

Насколько я знаю, static не подходит для совместного использования одного и того же класса.члены,

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

Я хотел бы узнать больше о плюсах и минусах этого двустороннего подхода.

Будем благодарны за любые советы.

Мой английский довольно простой, пожалуйста, не возражайте.

Спасибо за ваше чтение.

Ответы [ 3 ]

0 голосов
/ 06 июня 2018

Я бы пошел с вашим первым подходом и изменил бы ваш метод Upload на асинхронный, чтобы независимые задачи могли выполняться одновременно.При втором подходе у вас могут быть два разных потока, которые изменяют один и тот же объект не поточно-безопасным способом.

Сделайте что-то вроде этого:

public class MyClass{

    private readonly string _jsonPath= ...;
    private readonly StorageClient _storageClient;

    public MyClass()
    {
        var credential = GoogleCredential.FromFile(_jsonPath);
        _storageClient = StorageClient.Create(credential);
    }

    public Task<string> UploadAsync(/*my parameter*/)
    {
        var imageObject = await _storageClient.UploadObjectAsync(...);
        // etc
    }
}
0 голосов
/ 06 июня 2018

В зависимости от ваших требований к MyClass ответить на этот вопрос сложно.Что делает MyClass?Требуется ли какая-то настройка?Строительство?Зависит ли метод Upload от состояния экземпляра?

Я обычно люблю вставлять свои внешние зависимости и скрывать их за интерфейсами.Таким образом, я создаю двойные тесты и легко изменяю зависимости, если захочу.Мне не нравится использовать статику, если только она не предназначена для вспомогательных классов без сохранения состояния, таких как математика, манипуляции со строками, расширения и другая обработка без сохранения состояния.

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

В вашем случае я бы создал IStorageProvider, реализовал бы GoogleCloudStorageProvider и поместил бы зависимость IStorageProvider на MyClass.

public class MyClass {
    IStorageProvider Storage;
    public MyClass(IStorageProvider storage)
    {
        Storage = storage;
    }
    public async void Upload(Data data){
        await Storage.Save(data);
    }
}

public interface IStorageProvider{
    void Upload(Data data);
}

public class GoogleCloudStorage:IStorageProvider{
    private Credentials Creds;
    private GoogleCloudClient Client;
    public GoogleCloudStorage(Credentials creds)
    {
        Creds = creds;
        Client = new GoogleCloudClient();
    }

    private void Connect(){
        Client.Connect(Creds);
    }
    public async void Upload(Data data){
        if(!Client.Connected){
            Connect();
        }
        return await Client.Upload(data);
    }
}

Мне кажется, что этот подход немного более гибкий.

0 голосов
/ 06 июня 2018

Вы можете использовать статический класс для частого использования component.but я рекомендую вам использовать шаблон проектирования Singleton для этого процесса.

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