프로그래밍/WPF, Silverlight

[.NET WPF] WPF로 알아보는 종속성 주입(Inversion of Control (IoC)) 패턴 fast.Logger

당근천국 2023. 12. 15. 15:30

ASP.NET Core는 기본적으로 종속성 주입 패턴을 사용하고 있어서 따로 설정할게 없지만 WPF는 그렇지 않습니다.

만약 종속성주입이 귀찮다 하면 종속성 없이 사용해도 됩니다.

 

연관글 영역

 

 

1. 프로젝트 준비

WPF 프로젝트를 생성하고

종속성 주입 구현을 위해서 아래 패키지를 누겟(Nuget)에서 찾아 설치해 줍니다.

Microsoft.Extensions.DependencyInjection

 

이 프로젝트에서는 콘솔출력도 사용할 예정이라 아래 패키지도 설치해 줍니다.

Microsoft.Extensions.Hosting

 

로그파일 출력은 아래 패키지를 이용합니다.

NReco.Logging.File

 

 

2. 종속성 주입 구현

'App.xaml'에서 'StartupUri'를 제거해 줍니다.

 

'App.xaml.cs' 파일을 열어서 종속성 주입의 주체가 될 서비스프로바인더(ServiceProvider)를 세팅해줍니다.

 

서비스프로바인더 개체를 저장할 변수를 선언합니다.

/// <summary>
/// 서비스 개체
/// </summary>
private ServiceProvider serviceProvider;

 

 

생성자에 다음 코드를 넣어 서비스프로바인더를 설정해 줍니다.

(참고 : github - DotNetSamples/LoggingNReco_WPF/App.xaml.cs )

public App()
{
    ServiceCollection services = new ServiceCollection();

    //로깅 주입 및 로그 파일 설정
    services.AddLogging(loggingBuilder
        => loggingBuilder.AddFile("Logs/Log_{0:yyyy}-{0:MM}-{0:dd}.log"
            , fileLoggerOpts =>
            {
                //파일 출력 이름
                fileLoggerOpts.FormatLogFileName = fName =>
                {
                    return String.Format(fName, DateTime.Now);
                };
            })
            //로거 표시 설정
            .AddSimpleConsole(c => c.TimestampFormat = "[yyyy-MM-dd HH:mm:ss] ")
            .AddFilter((provider, category, logLevel) =>
            {
                return true;
            }));

    services.AddSingleton<MainWindow>();
    this.serviceProvider = services.BuildServiceProvider();
}

 

이 샘플에서는 로깅을 주입하고 'LoggingNReco'를 세팅하여 로그를 남깁니다.

 

 

이제 주입된 종속성이 동작 하면서 프로젝트가 동작하도록

프로젝트가 시작되면 메인윈도우(MainWindow)를 열어줍니다.

    /// <summary>
    /// 프로그램 시작
    /// </summary>
    /// <param name="e"></param>
    protected override void OnStartup(StartupEventArgs e)
    {
        this.serviceProvider.GetService<MainWindow>()!.Show();

        base.OnStartup(e);
    }

 

 

 

3. 종속성 전달 받기

이제 ASP.NET에서 했던 것처럼 종속성을 전달받을 수 있습니다.

/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class MainWindow : Window
{
    /// <summary>
		/// 자체 로거 개체
		/// </summary>
    private readonly ILogger logger;

    /// <summary>
    /// 
    /// </summary>
    /// <param name="loggerFactory">종속성으로 주입된 로거 개체</param>
    public MainWindow(ILogger<MainWindow> loggerFactory)
    {
        this.logger = loggerFactory;

        InitializeComponent();
    }
}

 

 

4. 테스트

이제 로그를 찍어봅시다.

 

콘솔에도 잘 나오고, 파일로도 잘 출력됩니다.

 

 

마무리

참고 : 

MSJO.kr - WPF Dependency Injection

Reduce bugs with elmah.io - Logging and global error handling in .NET 7 WPF applications

MS Learn - .NET 종속성 주입

 

테스트 프로젝트 : githug - DotNetSamples/LoggingNReco_WPF

 

'App.xaml'에서 ' StartupUri'를 꼭 제거해야 합니다.

안 그러면 따로 메인윈도우를 생성해서 열기 때문에 생성자가 없어서 에러 납니다.