.NET 콘솔 애플리케이션에서 종속성 주입 구성

종속성 주입은 대부분의 .NET 애플리케이션에서 널리 사용되는 개념입니다. 그 이유 중 하나는 .NET 웹 API에서 바로 사용할 수 있지만 몇 가지 중요한 다른 이점도 제공하기 때문일 수 있습니다.

그러나 새 콘솔 응용 프로그램을 시작할 때 기본적으로 종속성 주입을 사용할 수 없으므로 추가해 봅시다!

설정 🧰



설정은 매우 간단하며 .NET 콘솔 애플리케이션만 생성하면 됩니다.

~$ dotnet new console -o DepencyInjectionInConsoleApp


간단한 콘솔 애플리케이션 📦



이 예에서는 맞춤법 검사기가 있는 텍스트 편집기로 작업합니다.

맞춤법 검사기를 만들어 보겠습니다.

// ISpellChecker.cs
namespace DependencyInjectionInConsoleApp;

public interface ISpellChecker
{
    bool IsValid(string text);
}

public class VeryBadSpellChecker : ISpellChecker
{
    public bool IsValid(string text)
        => true;
}


이제 텍스트 편집기를 만들 수 있습니다.

// TextEditor.cs
namespace DependencyInjectionInConsoleApp;

public class TextEditor
{
    private readonly ISpellChecker _spellChecker;

    public TextEditor(ISpellChecker spellChecker)
        => _spellChecker = spellChecker;

    public void Edit(string text)
    {
        if (!_spellChecker.IsValid(text))
        {
            throw new InvalidOperationException("Text is not valid");
        }

        // Process the text

        Console.WriteLine("Text processed");
    }
}


마지막으로 편집기를 만들고 호출해 보겠습니다.

// Program.cs
using DependencyInjectionInConsoleApp;

var spellChecker = new VeryBadSpellChecker();
var textEditor = new TextEditor(spellChecker);

textEditor.Edit("Hello, world!");


선택적으로 프로그램을 실행하여 설정을 테스트할 수 있습니다.

~/DepencyInjectionInConsoleApp$ dotnet run
Text processed


모두 준비되었습니다!

문제



이 예에서는 몇 개의 클래스와 TextEditor에 대한 ISpellChecker의 단일 종속성만 있지만 실제 프로젝트에서는 각각 수십 개가 있을 수 있습니다.

이 경우 Program.cs 파일에 객체를 생성하는 것은 다음과 같이 객체 생성에만 전적으로 사용되는 많은 코드 행으로 이어지기 때문에 좋은 해결책이 아닙니다.

var logger = new SpecificLogger();
var databaseContext = new DatabaseContext(logger);
var spellChecker = new FrenchSpellChecker(logger);
var currentUserService = new CurrentUserService(logger, databaseContext)
var textEditor = new TextEditor(currentUserService, spellChecker);
// and so on


또한 개체의 종속성을 변경하는 경우 전체 초기화 프로세스를 거쳐야 할 수도 있습니다. 설상가상으로 동일한 인터페이스의 다른 구현을 다루는 경우 주의해야 합니다.

var spellChecker1 = new FrenchSpellChecker();
var spellChecker2 = new EnglishSpellChecker();
// ...
var englandAmbassyTextEditor = new TextEditor(spellChecker1);
// ^ We probably not meant it to be the french one !


여기에서 종속성을 혼합하는 것은 다른 많은 코드 줄 아래에 묻히기 때문에 어려운 일입니다.

이것이 종속성 주입으로 해결할 수 있는 몇 가지 문제입니다. 그렇게 하는 것이 좋습니다!

의존성 주입 가져오기 💉



콘솔 애플리케이션에서 종속성 주입을 도입하는 문제에 처음 직면했을 때 가혹한 프로세스가 될 것이라고 예상했지만 놀랍게도 실제로는 그렇지 않습니다.

먼저 Microsoft의 종속성 주입 확장 패키지를 추가해야 합니다.

~DepencyInjectionInConsoleApp$ dotnet add package Microsoft.Extensions.DependencyInjection


이제 종속성 주입 컨테이너를 구성할 수 있습니다.

using Microsoft.Extensions.DependencyInjection;

var serviceProvider = new ServiceCollection()
    .AddTransient<ISpellChecker, VeryBadSpellChecker>()
    .AddTransient<TextEditor>()
    .BuildServiceProvider();


마지막으로 수동 초기화를 제거하고 종속성 주입 컨테이너에서 TextEditor를 검색합니다.

- var spellChecker = new VeryBadSpellChecker();
- var textEditor = new TextEditor(spellChecker);
+ var textEditor = serviceProvider.GetRequiredService<TextEditor>();
textEditor.Edit("Hello, world!");


이제 프로그램을 다시 한 번 실행하여 아무것도 변경되지 않았는지 확인할 수 있습니다.

~/DepencyInjectionInConsoleApp$ dotnet run
Text processed


그리고 끝났습니다!

테이크 아웃



간단한 콘솔 응용 프로그램에서 시작하여 프로젝트에 종속성 주입 기능을 성공적으로 도입하여 개체를 호출할 때 더 간단하고 종속성을 업데이트하기가 더 쉬워졌습니다.

이 예에서는 Microsoft에서 제공하는 컨테이너를 사용했지만 다른 여러 컨테이너도 존재합니다chose them according to your needs and feel !

좋은 웹페이지 즐겨찾기