[C#프로그래밍] [WPF] PC 카카오톡 만들기 #02 - 의존성 주입

728x90

 

https://www.youtube.com/watch?v=DxibckiPDw0&list=PLlrfTSXS0LLKHfOfwM31jJw3SHuDnkF49&index=3

 

📌 의존성 주입 세팅

초기세팅코드

public App()
    {
        Services = ConfigureServices();

        this.InitializeComponent();
    }

    /// <summary>
    /// Gets the current <see cref="App"/> instance in use
    /// </summary>
    public new static App Current => (App)Application.Current;

    /// <summary>
    /// Gets the <see cref="IServiceProvider"/> instance to resolve application services.
    /// </summary>
    public IServiceProvider Services { get; }

    /// <summary>
    /// Configures the services for the application.
    /// </summary>
    private static IServiceProvider ConfigureServices()
    {
        var services = new ServiceCollection();

        services.AddSingleton<IFilesService, FilesService>();
        services.AddSingleton<ISettingsService, SettingsService>();
        services.AddSingleton<IClipboardService, ClipboardService>();
        services.AddSingleton<IShareService, ShareService>();
        services.AddSingleton<IEmailService, EmailService>();

        return services.BuildServiceProvider();
    }

위 코드를 복사해서 App.xaml에 붙여넣기 해 준다.

📌 서비스 생성

namespace seungjjangTalk.Services
{
    internal class TestService
    {

        public string GetString()
        {
            return "카톡입니다.";
        }
    }
}

 

  • ITestService.cs
namespace seungjjangTalk.Services
{
    public interface ITestService
    {
        string GetString();
    }
}

 

  • TestService.cs
namespace seungjjangTalk.Services
{
    internal class TestService : ITestService
    {

        public string GetString()
        {
            return "카톡입니다";
        }
    }
}

 

  • mainWindow.xaml
namespace seungjjangTalk
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            ITestService service = new TestService();
            MessageBox.Show(service.GetString());
        }
    }
}



◾ 의존성 주입

  • AddSingleton : 한 번 생성하면 그 객체는 끝날 때 까지 사용

 

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

            //Singleton으로 선언하여 TestService 객체를 ITestService 인터페이스로 주입하겠다라는 
            //서비스를 주입 
            //의존성을 주입하면 main에서 생성자에서 불러 올 수 있다.
            services.AddSingleton<ITestService, TestService>();

            return services.BuildServiceProvider();
        }

 

◾ 의존성을 주입한 뒤 main에서 생성자로 불러오기

  • MainWindow.xaml.cs
    public partial class MainWindow : Window
    {

        //생성자 생성
        public MainWindow(ITestService testService)
        {
            InitializeComponent();
            //getString으로 불러오기 
            MessageBox.Show(testService.GetString());
            //ITestService service = new TestService();
            //MessageBox.Show(service.GetString());
        }

 

◾ 생성자 생성

  • App.xaml에서 StartupUri 삭제


- App.xaml.cs에서 비하인드 코드로 작성

        public App()
        {
            Services = ConfigureServices();
            Startup += App_Startup;

        }

        private void App_Startup(object sender, StartupEventArgs e)
        {
            var mainView = new MainWindow();

        }

  • 여기서 매개변수를 생성하면 의존성 주입의 의미가 사라지기 때문에 생성자 주입이라는 것을 지원함

 

◾ 생성자 주입

생성자 주입 관련 링크

App.Current.Services.GetService<IFileLogger>(); 생성자 주입 구문을 복사하여 사용

  • App.xaml.cs
        public App()
        {
            Services = ConfigureServices();
            Startup += App_Startup;

        }

        private void App_Startup(object sender, StartupEventArgs e)
        {
            var mainView = App.Current.Services.GetService<MainWindow>();
            mainView.Show();

        }
  • 생성자 주입 구문을 사용하면 생성자의 매개변수를 입력하지 않아도 객체가 만들어지고 호출이된다.
  • 단, 이것도 서비스에 등록이 되어야 사용이 가능하다.

 

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


            //Services

            /*Singleton으로 선언하여 TestService 객체를 ITestService 인터페이스로 주입하겠다라는 
              서비스를 주입 
              의존성을 주입하면 main에서 생성자에서 불러 올 수 있다.*/
            services.AddSingleton<ITestService, TestService>();

            //Views
            /* 의존성이 추가 된 MainWindow를 만들어준다. */
            services.AddSingleton<MainWindow>();

            return services.BuildServiceProvider();
        }
  • App.xaml.cs
  • services.AddSingleton<MainWindow>(); : 의존성이 주입이 된 MainWindow를 만들게된다
  • var mainView = App.Current.Services.GetService<MainWindow>(); 에서 객체를 생성 할 때 생성자의 매개변수에 넣을 수 있다.

  • public MainWindow(ITestService testService) : 이 매개변수가 호출되면서 서비스가 실행된다.

📌 정리

  • 의존성 주입을 하면 매번 객체를 생성하지 않고 서비스에서 등록을 한 객체를 생성자의 매개변수로써 불러오게되면 간단하게 사용 할 수 있다.
728x90