C#

[C#]의존성 주입 예시

수학소년 2024. 2. 21. 01:26

1. WPF Application 만들기

.NET 8.0(Long Term)으로.

 

2. Service만들기

Services폴더 만들고,

using System.Diagnostics;

namespace WpfApp3.Services
{
    public interface IUserService
    {
        public void Test();
    }

    public class UserService : IUserService
    {

        public void Test()
        {
            Debug.WriteLine("UserService.Test()");
        }
    }
}

 

3. App.xaml.cs 수정

Microsoft.Extensions.DependencyInjection 를 사용하려면

Microsoft.Extensions.DependencyInjection 의존성 추가

using Microsoft.Extensions.DependencyInjection;
using System.Diagnostics;
using System.Windows;
using WpfApp3.Services;

namespace WpfApp3
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : Application
    {
        public IServiceProvider ServiceProvider { get; set; }

        public App()
        {
            ServiceProvider = ConfigureServices();
        }

        private static IServiceProvider? ConfigureServices()
        {
            Debug.WriteLine("ooooooooooooo");
            var services = new ServiceCollection();

            services.AddSingleton<IUserService, UserService>();

            return services.BuildServiceProvider();
        }

        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
            IUserService userService = ServiceProvider.GetService<IUserService>();
            userService.Test();
        }
    }

}

App생성자가 호출되면서 ConfigureService가 호출되고,

ServiceProvider에 UserService를 추가

 

그 후에 OnStartup 호출

(OnStartup을 호출시키려면, App.xaml에 StartupUri를 제거)

그러면서 UserService.Test호출

 

4. Service에서 Service호출

또 다른 Service를 만들고 거기서 UserService.Test를 호출해보자

만들 Service는 UserService를 주입받는다

using System.Diagnostics;

namespace WpfApp3.Services
{
    public interface IOtherService
    {
        public void Test();
    }

    public class OtherService : IOtherService
    {
        public void Test()
        {
            Debug.WriteLine("OtherService.Test()");
        }
    }
}
using System.Diagnostics;

namespace WpfApp3.Services
{
    public interface IUserService
    {
        public void Test();
    }

    public class UserService : IUserService
    {
        private IOtherService _otherService;

        public UserService(IOtherService otherService)
        {
            _otherService = otherService;
        }

        public void Test()
        {
            Debug.WriteLine("UserService.Test()");
            _otherService.Test();
        }
    }
}

IOtherService가 ServiceProvider에 있어야 UserService생성자에서 주입받을 수 있다

ServiceProvider에 추가해주자

// App.xaml.cs
        private static IServiceProvider? ConfigureServices()
        {
            var services = new ServiceCollection();

            services.AddSingleton<IUserService, UserService>();
            services.AddSingleton<IOtherService, OtherService>(); // <-- 추가

            return services.BuildServiceProvider();
        }