C#

C# WPF에서 Dependency Injection(DI) 적용하기

samie 2025. 3. 25. 13:43
C# WPF에서 Dependency Injection(DI) 적용하기

C# WPF에서 Dependency Injection(DI) 적용하기

WPF(Windows Presentation Foundation) 애플리케이션을 개발하면서 의존성 주입(Dependency Injection, DI)을 활용하면 코드의 유지보수성을 높이고, 테스트 가능성을 개선할 수 있습니다. DI는 클래스가 다른 클래스의 인스턴스를 직접 생성하는 대신 외부에서 주입받는 방식으로, 코드의 결합도를 낮추고 유연성을 제공합니다. 이 글에서는 C# WPF 애플리케이션에서 DI를 적용하는 방법과 이를 통해 얻을 수 있는 이점에 대해 다루겠습니다.

1. Dependency Injection(DI)란?

Dependency Injection(DI)은 객체 지향 설계에서 중요한 패턴으로, 객체가 자신의 의존 객체를 직접 생성하지 않고 외부에서 주입받는 방식을 말합니다. 이를 통해 클래스 간의 결합도를 낮추고, 코드의 재사용성과 테스트 가능성을 높일 수 있습니다. DI는 특히 대규모 애플리케이션에서 의존성 관리가 용이하도록 도와주며, WPF 애플리케이션에서 MVVM 패턴을 구현할 때 유용하게 사용됩니다.

2. WPF에서 DI 적용하기

C# WPF에서 DI를 적용하려면 먼저 DI를 지원하는 라이브러리를 사용해야 합니다. 가장 널리 사용되는 DI 라이브러리는 Microsoft.Extensions.DependencyInjection입니다. 이를 통해 WPF 애플리케이션에 DI를 손쉽게 적용할 수 있습니다. 아래에서는 DI를 설정하고 ViewModel에 의존성 주입을 적용하는 방법을 살펴보겠습니다.

2.1. Microsoft.Extensions.DependencyInjection 설치

먼저, NuGet을 통해 Microsoft.Extensions.DependencyInjection 라이브러리를 프로젝트에 추가합니다. Visual Studio에서 NuGet 패키지 관리자를 사용하거나, Package Manager Console에서 아래 명령어를 실행하여 설치할 수 있습니다.

Install-Package Microsoft.Extensions.DependencyInjection

2.2. DI 컨테이너 설정

DI를 사용하기 위해서는 먼저 DI 컨테이너를 설정해야 합니다. 이 컨테이너는 객체를 관리하고, 필요한 의존성을 주입하는 역할을 합니다. WPF 애플리케이션에서는 App.xaml.cs 파일에서 DI 컨테이너를 설정할 수 있습니다.


using Microsoft.Extensions.DependencyInjection;
using System.Windows;

namespace WpfApp
{
    public partial class App : Application
    {
        private ServiceProvider _serviceProvider;

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            // DI 컨테이너 설정
            var serviceCollection = new ServiceCollection();
            ConfigureServices(serviceCollection);
            _serviceProvider = serviceCollection.BuildServiceProvider();

            var mainWindow = _serviceProvider.GetRequiredService();
            mainWindow.Show();
        }

        private void ConfigureServices(IServiceCollection services)
        {
            // ViewModel 등록
            services.AddSingleton();

            // View 등록
            services.AddSingleton();
        }
    }
}
    

2.3. ViewModel에 의존성 주입하기

DI 컨테이너를 설정한 후, ViewModel에 필요한 서비스를 주입할 수 있습니다. 예를 들어, MainViewModel에서 다른 서비스를 사용할 경우, 해당 서비스를 DI 컨테이너에서 주입받을 수 있습니다.


public class MainViewModel
{
    private readonly IMyService _myService;

    public MainViewModel(IMyService myService)
    {
        _myService = myService;
    }

    public string GetServiceData()
    {
        return _myService.GetData();
    }
}
    

2.4. 서비스 정의 및 등록

위의 예제에서 IMyService는 의존성으로 주입받은 서비스입니다. 이제 이 서비스를 DI 컨테이너에 등록해야 합니다. ConfigureServices 메서드에서 이 서비스를 등록합니다.


public interface IMyService
{
    string GetData();
}

public class MyService : IMyService
{
    public string GetData()
    {
        return "서비스에서 가져온 데이터";
    }
}
    

private void ConfigureServices(IServiceCollection services)
{
    services.AddSingleton();
    services.AddSingleton();
    services.AddSingleton();
}
    

3. DI를 사용한 WPF 애플리케이션의 장점

  • 유연성 향상: DI를 사용하면 객체 생성 방식에 대한 제어권을 외부로 넘기므로 코드의 유연성이 향상됩니다.
  • 테스트 용이성: ViewModel의 의존성을 주입받으면 테스트를 위한 Mock 객체나 다른 구현체를 주입할 수 있어 테스트가 용이합니다.
  • 코드의 결합도 감소: DI를 사용하면 클래스 간의 결합도가 낮아지므로 유지보수가 쉬워집니다.
  • 확장성 향상: 새로운 서비스나 ViewModel을 추가할 때 기존 코드를 수정하지 않고 DI 컨테이너에 새로운 의존성만 등록하면 됩니다.

4. 결론

C# WPF 애플리케이션에서 Dependency Injection(DI)을 적용하면 코드의 유연성과 유지보수성을 크게 향상시킬 수 있습니다. DI를 통해 객체 간의 결합도를 낮추고, 테스트가 용이한 구조를 만들 수 있습니다. Microsoft.Extensions.DependencyInjection 라이브러리를 사용하면 WPF 애플리케이션에서 DI를 쉽게 적용할 수 있으며, ViewModel 및 서비스 간의 의존성 관리가 수월해집니다. DI는 WPF 애플리케이션의 품질을 높이는 중요한 기술입니다.