Nuget Package, Dependency Injection
Dependecy Injection
Nuget Package, Dependency Injection
MVVM 패턴을 쓰면서 같이 사용하면 좋은 Nuget Package 를 소개 한다.
Dependency Injection(DI)란?
- 객체 간 의존성을 외부에서 주입하는 설계 패턴
왜 쓰나?
- 코드를 유연하게 만들고
- 구체 클래스에 대한 의존을 줄여서 유지보수를 쉽게 하려고.
장점
- 결합도 감소: 코드가 느슨하게 연결되어 변경에 강함
- 테스트 편의성: Mock 객체를 주입해서 단위 테스트 가능
- 유지보수성 향상: 기능 변경 시 코드 영향 최소화
- 재사용성 증가: 코드가 다양한 상황에 재사용 가능
- 구성 유연성: 어떤 구현체를 사용할지 쉽게 바꿀 수 있음
특히 WPF 에서는 MVVM 패턴을 쓸 때 ViewModel 이나 Service를 DI 로 주입하면, 코드가 깔끔하고, 테스트 작성도 쉬어지고, 유지보수도 엄청 편해짐.
1. Microsoft.Extensions.DependencyInjection
Nuget Package 를 설치하여 준다. 역시 마이크로소프트에서 기능을 제공한다.
2. 서비스 등록
App.xaml.xs 에서 DI 컨테이너를 설정하고, 필요한 서비스와 ViewModel 등록
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public partial class App : Application
{
public static new App Current => (App)Application.Current;
public IServiceProvider Services { get; }
public App()
{
Services = ConfigureServices();
}
private static IServiceProvider ConfigureServices()
{
var services = new ServiceCollection();
services.AddSingleton<MainViewModel>();
services.AddSingleton<MyService>(); // 새로 만든 클래스
return services.BuildServiceProvider();
}
}
3. ViewModel 주입
1
2
3
4
5
6
7
8
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
DataContext = App.Current.Services.GetService(typeof(MainViewModel));
}
}
4. 의존성 선언
1
2
3
4
5
6
7
8
9
10
11
public partial class MainViewModel : ObservableObject
{
private readonly MyService _myService;
public MainViewModel(MyService myService)
{
_myService = myService;
}
// 다른 속성, RelayCommand 숨김
}
핵심 포인트 요약
- 등록: 서비스/뷰모델 등록
- 주입: 필요한 곳에서 DI 컨테이너를 통해 인스턴스 주입
- 생성자: 필요한 의존성은 생성자로 받기
쓰면서 느낀점은
- ViewModel 에서 다른 ViewModel 의 값을 불러올 때, 편한 점이 있다. => ViewModel 간 의존선 주입이 깔끔해진다.
- 현재 프로젝트에서 어떤 서비스를 사용하고 있는지 한 눈에 볼 수 있다. => 서비스 사용 현황이 명확하다.
요약: DI 를 쓰면 코드 구조가 투명해지고, 협업/유지보수가 편해진다
참조
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.