MAUI에서 자동으로 서비스 등록

리플렉션을 사용하여 MAUI viewModel 및 페이지를 종속성 서비스 컨테이너에 등록하는 것을 자동화합니다.



MAUI 재작성 작업이 시작된 지 꽤 시간이 흘렀고 MAUI GA가 드디어 출시되어 기쁩니다.

MAUI로 작업할 때 개발자 주기를 단축하는 데 도움이 되도록 즉시 구현한 모든 새로운 기능이 마음에 듭니다.

내가 하는 일 중 하나는 Xamarin에서 정말 성가신 일 중 하나로 의존성 컨테이너를 설정하고 부트스트랩을 해야 한다는 것이었습니다. 그것은 벅찬 일이었지만 이제 MAUI는 ASPNET에서와 똑같이 보이고 작동하는 내장된 종속성 컨테이너를 제공합니다. CORE, 그렇죠?! 하지만 이제 수동으로 만든 페이지를 포함하여 모든 것을 등록해야 하는 서비스를 주입할 수 있으려면 이 반복적인 노동이 내 흥분을 죽이기 시작했고 내 MAUI 프로그램 클래스가 부풀어 오르고 있었습니다.
다음은 일반적인 MAUI 프로그램 클래스가 어떻게 생겼는지에 대한 간단한 예입니다.

builder.Services.AddSingleton<ISomeProductService,SomeProductService>();
builder.Services.AddSingleton<MainPage>();
builder.Services.AddSingleton<ProductsPage>();
builder.Services.AddSingleton<ProductDetailPage>();
builder.Services.AddSingleton<AboutPage>();
builder.Services.AddSingleton<AboutPageViewModel>();
builder.Services.AddSingleton<ProductDetailPageViewModel>();
builder.Services.AddSingleton<ProductsPageViewModel>();
builder.Services.AddSingleton<HomePageViewModel>();


그리고 이것은 단지 작은 예일 뿐입니다. 수동으로 논문 수업을 등록하고 네 번째로 돌아가는 과정이 답답합니다.

운 좋게도 C# Guru가 여기 있고 저는 이 프로세스를 자동화하는 데 사용할 C#의 동적 프로그래밍과 관련된 빠른 트릭 고대 트릭을 가지고 있습니다. 반사를 사용하여 우리는
종속성 컨테이너에 등록하려는 모든 클래스와 페이지를 스캔하고 수집한 다음 모두 등록합니다.

*시작하자 *

먼저 컨테이너의 싱글톤 범위에 등록하려는 클래스의 서명으로 사용할 인터페이스를 만들 것입니다.

우리는 이 인터페이스를 IsingletonDependency라고 부를 것입니다. 싱글톤 서비스로 등록하려는 모든 서비스는 이 인터페이스를 구현해야 합니다.

인터페이스는 다음과 같습니다.

    public interface ISingletonDependency
    {
    }


2.

두 번째로 MAUIBuilder에 추가 동작을 첨부하는 확장 메서드를 추가할 것입니다.

이 확장 메서드는 모든 동적 프로그래밍 논리를 캡슐화하며 MAUIProgram.cs 클래스에 서비스를 등록하기 위해 호출되는 유일한 메서드입니다.

다음과 같은 MauiAppBuilderExtensions라는 정적 클래스를 만들 것입니다.

    public static class MauiAppBuilderExtensions
    {
        public static void ConfigureServices(this MauiAppBuilder builder)
        {
            RegisterSingletonServices(builder);
        }


    }


다음으로 동일한 클래스에서 RegisterSingletonServices라는 정적 메서드를 만들 것입니다. 이 메서드는 어셈블리를 스캔하고 IsingletonDependency를 구현하는 모든 클래스를 수집한 다음 각 클래스 유형을 종속성 컨테이너에 등록합니다.

이 방법은 다음과 같습니다.

        private static void RegisterSingletonServices(MauiAppBuilder builder)
        {
            var services = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes())
                            .Where(x => typeof(ISingletonDependency).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract).ToList();

            foreach (var service in services)
                builder.Services.AddSingleton(service);
        }



전체 확장은 다음과 같습니다.

    public static class MauiAppBuilderExtensions
    {
        public static void ConfigureServices(this MauiAppBuilder builder)
        {
            RegisterSingletonServices(builder);
        }

        private static void RegisterSingletonServices(MauiAppBuilder builder)
        {
            var services = AppDomain.CurrentDomain.GetAssemblies().SelectMany(x => x.GetTypes())
                            .Where(x => typeof(ISingletonDependency).IsAssignableFrom(x) && !x.IsInterface && !x.IsAbstract).ToList();

            foreach (var service in services)
                builder.Services.AddSingleton(service);
        }
    }


그게 우리가 거의 끝낸 것입니다.

다음 단계는 MAUI 프로그램 클래스에서 이 확장 메서드를 호출하는 것입니다.
builder.ConfigureServices();
전체 MAUIProgram 클래스는 이제 다음과 같습니다.

    public static MauiApp CreateMauiApp()
    {
        var builder = MauiApp.CreateBuilder();
        builder
            .UseMauiApp<App>()
            .ConfigureFonts(fonts =>
            {
                fonts.AddFont("OpenSans-Regular.ttf", "OpenSansRegular");
                fonts.AddFont("OpenSans-Semibold.ttf", "OpenSansSemibold");
            });
        builder.ConfigureServices();

        return builder.Build();
    }


아주 깨끗하죠?!!! 예 그렇습니다.

이제 viewModel 클래스가 어떻게 생겼는지 스스로에게 물어볼 수 있습니다. 다음과 같습니다.

//View model class example
   public partial class LoginPageViewModel :  ISingletonDependency
    {



//Page code behind class example.
    public partial class LoginPage : ContentPage,ISingletonDependency


컨테이너의 클래스를 싱글톤으로 등록하려는 경우 ISingletonDependency 인터페이스를 구현하기만 하면 됩니다.

성능 ??

저는 리플렉션 및 벤치마킹 분야의 전문가는 아니지만 리플렉션을 사용하기 때문에 어셈블리를 스캔해야 하기 때문에 무시할 수 있는 시작 ms 페널티가 분명히 있을 것이라고 가정합니다.

건배 여러분, 이것이 귀하의 프로젝트에 도움이 되기를 바랍니다. 여러분의 생각도 듣고 싶습니다..

좋은 웹페이지 즐겨찾기