[Mvvm] 📂. Inversion of Control (Ioc)
1. Microsoft.Toolkit.Mvvm.DependenctInjection
- ViewModel 생성자에 대한 매개변수로 서비스를 전달 할 때
종속성 주입(Dependency Injection
을 사용한다.종속성 주입(Dependency Injection) : 외부에서 두 객체 간의 관계를 결정해 주는 디자인
- 추상화 한 서비스를 필요한 곳에 주입하여 백엔드 코드에서 쉽게 사용할 수 있다.
- Mvvm Toolkit에서는 Ioc 구현을 위한 API를 제공하지 않는다. (아래의 두 패키지를 NuGet에서 다운받아 사용한다.)
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.DepencencyInjection.Abstractions
2. 사용 방법
1. 프로그램 진입점에 선언 부분
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Toolkit.Mvvm.DependencyInjection;
public static IServiceProvider serviceProvider;
// 프로그램 초기화 부분
{
serviceProvider = ConfigureServides();
// 종속성을 관리해주는 Ioc에 사용할 클래스 들을 등록해준다.
Ioc.Default.ConfigureServices(serviceProvider);
}
// ConfigureServices 구현
private static IServiceProvider ConfigureServides()
{
var services = new ServiceCollection();
// View, ViewModel, Model, App Context, Serveice 등록
// ...
return services.BuildServiceProvider(validateScopes: true);
}
- ConfigureServices에 사용하는 클래스를 선언한다. 이때, 서비스 수명을 고려하여 사용의도에 맞게 선언한다.
Transient
: 서비스 컨테이너에서 요청할 때 마다 생성Scoped
: 범위를 지정할 때 마다 만들어짐 (범위 안에서는 유일)Singletion
: 처음 요청될 때 생성 후, 동일한 인스턴스 사용
2. 종속성 주입 부분
public class TestClass1
{
public TestClass1() {}
// ...
}
// TestClass2는 TestClass1에 종속되어있다.
public class TestClass2
{
private TestClass1 _testclass1;
// 참조 할 클래스를 생성자에서 매개변수로 받아준다.
public TestClass2(TestClass1 testclass1)
{
this._testclass1 = testclass1;
// ...
}
// ...
}
3. TestClass2 생성하기
using Microsoft.Toolkit.Mvvm.DependencyInjection;
// TestClass 인스턴스 생성
TestClass2 tc2 = Ioc.Default.GetService<TestClass2>();
- 생성 전,
ConfigureServides
에 클래스 등록을 해야 오류가 나지 않는다.
댓글남기기