Внедрение зависимостей или статический класс для вспомогательного класса?C#

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

Сообщение Anonymous »

В большинстве своих проектов я создаю статический класс, содержащий все функции, которые я использую в своем проекте.
Но когда дело доходит до модульного тестирования, я чувствую, что в моем проекте есть большой недостаток, поскольку я могу не использую Moq для имитации этого статического класса.
Я могу привести простой пример одного проекта, над которым я работаю, который копирует много файлов, поэтому я сделал небольшой помощник, чтобы избежать избыточность в моем коде.

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

public static class Helpers
{
public static void CopyFile(string sourcePath, string destPath)
{
Log.Verbose("Start copy from {SourcePath} to {DestPath}", sourcePath, destPath);
if (!Directory.Exists(Path.GetDirectoryName(destPath)))
{
Directory.CreateDirectory(Path.GetDirectoryName(destPath));
}
File.Copy(sourcePath, destPath, true);
Log.Verbose("End of copy from {SourcePath} to {DestPath}", sourcePath, destPath);
}
}
Таким образом, любой код, вызывающий эту функцию, не подлежит тестированию, поскольку я не могу имитировать статическую функцию внутри статического класса, который также использует System.IO
Для решения этой проблемы я попытался использовать System.IO.Abstraction и внедрение зависимостей, и у меня получился следующий код:

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

public interface IHelpers
{
public void CopyFile(string sourcePath, string destPath);
}

public class Helpers(IFileSystem fileSystem) : IHelpers
{
private readonly IFileSystem FileSystem = fileSystem;

public void CopyFile(string sourcePath, string destPath)
{
Log.Verbose("Start copy from {SourcePath} to {DestPath}", sourcePath, destPath);
if (!FileSystem.Directory.Exists(Path.GetDirectoryName(destPath)))
{
FileSystem.Directory.CreateDirectory(Path.GetDirectoryName(destPath));
}
FileSystem.File.Copy(sourcePath, destPath, true);
Log.Verbose("End of copy from {SourcePath} to {DestPath}", sourcePath, destPath);
}
}
Теперь мне просто нужно внедрить свой IHelper туда, куда мне нужно вызвать CopyFile, и все выглядит нормально.
За исключением некоторых редких случаев, когда мне кажется неправильным внедрить этот помощник внутрь класс.

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

public class Component
{
public string Name;
public string Path;

public void ExportOutput()
{
// ...
// much calculation then...
// multiple calls to Helpers.CopyFile(src,dest);
// ...
}
}
Чтобы решить эту проблему, я передал класс IHelper в качестве параметра ExportOutput, но это кажется совершенно отвратительным.
Единственное решение, которое я нашел: эта проблема заключалась в том, чтобы удалить функцию ExportOutput и поместить ее туда, где я мог бы полагаться на внедрение зависимостей для использования класса Helper.
Это правильно или я полностью упускаю суть?
Это правильно или я полностью упускаю суть?
p>
Как вы обычно справляетесь с такими мелкими вспомогательная функция в вашем коде?

Подробнее здесь: https://stackoverflow.com/questions/787 ... lper-class
Ответить

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

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

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

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

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