Внедрение зависимостей C# без объектов?C#

Место общения программистов C#
Ответить
Anonymous
 Внедрение зависимостей C# без объектов?

Сообщение Anonymous »

При написании приложений на C# часто создается впечатление, что нас поощряют создавать методы на основе экземпляров, даже если они естественным образом являются статическими. Конечно, C# — это язык, ориентированный прежде всего на ООП, и такие шаблоны, как внедрение зависимостей, макетирование и модульное тестирование, построены на экземплярах.
Однако в C# 11 появились статические методы в интерфейсах, поэтому технически мы можем это сделать:

Код: Выделить всё

public interface IFileHasher where T : IFileHasher
{
static abstract string ComputeHash(string filePath);
}

Код: Выделить всё

public class SHA256FileHasher : IFileHasher
{
public static string ComputeHash(string filePath)
{}
}
Традиционно мы внедряем зависимость, создавая и передавая новый экземпляр:

Код: Выделить всё

FileProcessor processor = new(new SHA256FileHasher())
Но с помощью этого шаблона зависимость можно выразить просто как параметр типа:

Код: Выделить всё

FileProcessor processor = new()
По сути, зависимость переходит от аргумента конструктора к аргументу универсального типа.
Это поднимает вопрос: как бы выглядело внедрение зависимостей, если бы оно поддерживало статические зависимости, а C# имел лучшую поддержку синтаксиса? Какие плюсы и минусы?
Некоторые из них я могу придумать

Плюсы:

1. Быстрее — никаких выделений. Все преимущества статики в скорости.

2. Более четкая семантика. Некоторые идеи лучше представлять в виде статических вещей, а не сначала создавать объект класса, а затем использовать функцию-член.

3. Поощряет написание чистых функций.
Минусы:

1. Нет состояния или времени жизни

2. Вы теряете возможность динамически менять реализации во время выполнения.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»