Maui: [์‚ฌ์–‘] Microsoft.Extensions.Hosting ๋ฐ/๋˜๋Š” Microsoft.Extensions.DependencyInjection

์— ๋งŒ๋“  2020๋…„ 05์›” 18์ผ  ยท  21์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: dotnet/maui

Microsoft.Extensions.Hosting์˜ ๊ธฐ๋Šฅ์„ .NET MAUI๋กœ ๊ตฝ๊ธฐ

https://montemagno.com/add-asp-net-cores-dependency-injection-into-xamarin-apps-with-hostbuilder/

.netcore 3.0์œผ๋กœ ์„ค์ •๋œ ์ผ๋ฐ˜ ํ˜ธ์ŠคํŠธ ๊ตฌ์กฐ๋ฅผ ํ™œ์šฉํ•˜์—ฌ .NET MAUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋งค์šฐ Microsoft ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ  ASP.NET ์ฝ”์–ด์™€ ์ผ์น˜ํ•˜๋Š” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

IServiceProvider๋ฅผ .NET MAUI์— ๊นŠ์ด ๋ฟŒ๋ฆฌ๊ธฐ

Activator.CreateInstance(Type)์˜ ๋ชจ๋“  ์ธ์Šคํ„ด์Šค๋ฅผ IServiceProvider.Get()์œผ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด ElementTemplate์—์„œ ์ด๊ฒƒ์„ ๋ณ€๊ฒฝํ•˜๋ฉด
https://github.com/dotnet/maui/blob/1a380f3c1ddd9ba76d1146bb9f806a6ed150d486/Xamarin.Forms.Core/ElementTemplate.cs#L26

๊ทธ๋Ÿฐ ๋‹ค์Œ ์œ ํ˜•์„ ํ†ตํ•ด ์ง€์ •๋œ ๋ชจ๋“  DataTemplate์€ ์ƒ์„ฑ์ž ์ฃผ์ž…์„ ํ†ตํ•ด ์ƒ์„ฑ๋˜๋Š” ์ด์ ์„ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ

```C#
Host.CreateDefaultBuilder()
.ConfigureHostConfiguration(c =>
{
c.AddCommandLine(์ƒˆ ๋ฌธ์ž์—ด[] { $"ContentRoot={FileSystem.AppDataDirectory}" });
c.AddJsonFile(์ „์ฒด ๊ตฌ์„ฑ);
})
.ConfigureServices((c, x) =>
{
๊ธฐ๋ณธ ๊ตฌ์„ฑ ์„œ๋น„์Šค(c, x);
ConfigureServices(c, x);
})
.ConfigureLogging(l => l.AddConsole(o =>
{
o.DisableColors = true;
}))
.์ง“๋‹ค();

์ •์  ๋ฌดํšจ ConfigureServices(HostBuilderContext ctx, IServiceCollection ์„œ๋น„์Šค)
{
if (ctx.HostingEnvironment.IsDevelopment())
{
var ์„ธ๊ณ„ = ctx.Configuration["์•ˆ๋…•ํ•˜์„ธ์š”"];
}

services.AddHttpClient();
services.AddTransient<IMainViewModel, MainViewModel>();
services.AddTransient<MainPage>();
services.AddSingleton<App>();

}

### Shell Examples

Shell is already string based and just uses types to create everything so we can easily hook into DataTemplates and provide ServiceCollection extensions 

```C#
static void ConfigureServices(HostBuilderContext ctx, IServiceCollection services)
{
     services.RegisterRoute(typeof(MainPage));
     services.RegisterRoute(typeof(SecondPage));
}

๋ชจ๋“  DataTemplates๊ฐ€ IServiceProvider๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋œ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” DataTemplates์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

<ShellContent ContentTemplate="{DataTemplate view:MainPage}"/ShellContent>
<ShellContent ContentTemplate="{DataTemplate view:ISecondPage}"></ShellContent>

์ƒ์„ฑ์ž ์ฃผ์ž…์—์„œ ๊ตฌ์›Œ์ง

```C#
๊ณต๊ฐœ ์ˆ˜์—… ์•ฑ
{
๊ณต๊ฐœ ์•ฑ()
{
์ดˆ๊ธฐํ™” ๊ตฌ์„ฑ ์š”์†Œ();
๋ฉ”์ธ ํŽ˜์ด์ง€ = ServiceProvider.GetService();
}
}
๊ณต๊ฐœ ๋ถ€๋ถ„ ํด๋ž˜์Šค MainPage : ContentPage
{
๊ณต๊ฐœ MainPage(IMainViewModel viewModel)
{
์ดˆ๊ธฐํ™” ๊ตฌ์„ฑ ์š”์†Œ();
BindingContext = ๋ทฐ ๋ชจ๋ธ;
}
}

๊ณต๊ฐœ ํด๋ž˜์Šค MainViewModel
{
๊ณต๊ฐœ MainViewModel(ILogger๋กœ๊ฑฐ, IHttpClientFactory httpClientFactory)
{
var httpClient = httpClientFactory.CreateClient();
logger.LogCritical("ํ•ญ์ƒ ๋กœ๊น…ํ•ฉ๋‹ˆ๋‹ค!");
Hello = "์•ˆ๋…•ํ•˜์„ธ์š” IoC";
}
}

### This will allow Shell to also have baked in Constructor Injection

```C#
Routing.RegisterRoute("MainPage", MainPage)

GotoAsync("MainPage") // this will use the ServiceProvider to create the type

Shell์˜ ์ผ๋ถ€๋กœ ์ง€์ •๋œ ๋ชจ๋“  ContentTemplates๋Š” IServiceProvider๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

    <ShellContent
        x:Name="login"
        ContentTemplate="{DataTemplate MainPage}"
        Route="login" />

๊ณ ๋ คํ•ด์•ผ ํ•  ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ

Microsoft.Build๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์ž‘ ํŒŒ์ดํ”„๋ผ์ธ ์ด‰์ง„

ํ˜ธ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ๊ฐ€์ ธ์™€ ์‚ฌ๋ฌผ์ด ๋“ฑ๋ก๋œ ํŠน์ • ์‹œ์ž‘ ์œ„์น˜๋ฅผ ๋ช…ํ™•ํžˆ ํ•ฉ๋‹ˆ๋‹ค.
https://montemagno.com/add-asp-net-cores-dependency-injection-into-xamarin-apps-with-hostbuilder/

์ด๋Š” ์ด๋ฏธ asp.net ์ฝ”์–ด์— ๋Œ€ํ•ด ์ž‘๋™ํ•˜๋Š” IoC ์ปจํ…Œ์ด๋„ˆ ๊ตฌํ˜„์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์žฅ์ : ์ด๋Š” .NET ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์ผ๊ด€๋œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
๋‹จ์ : ์„ฑ๋Šฅ? ๋ชจ๋ฐ”์ผ์—์„œ๋Š” ์ด๊ฒŒ ๊ณผํ•œ๊ฑด๊ฐ€์š”?

DI ์ปจํ…Œ์ด๋„ˆ ์˜ต์…˜

Microsoft.Extensions.DependencyInjection์„ ์œ„ํ•ด DependencyService ์‚ฌ์šฉ ์ค‘๋‹จ

Xamarin.Forms์—๋Š” ํ˜„์žฌ ๋งŽ์€ ๊ธฐ๋Šฅ์ด ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ๋งค์šฐ ๊ฐ„๋‹จํ•œ ์ž์ฒด ๊ฐœ๋ฐœ ์ข…์†์„ฑ ์„œ๋น„์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์˜ต์…˜์— ์ง๋ฉดํ•˜์—ฌ ์ด ์„œ๋น„์Šค์˜ ๊ธฐ๋Šฅ์„ ํ™•์žฅํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ Microsoft ํ”Œ๋žซํผ๊ณผ ๋ณด๋‹ค ์ ์ ˆํ•˜๊ฒŒ ์กฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด Microsoft.Extensions.DependencyInjection ๋‚ด๋ถ€์˜ ์ปจํ…Œ์ด๋„ˆ๋กœ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

DependencyService์˜ ์ž๋™ ๋“ฑ๋ก์€ ์ƒˆ ๋“ฑ๋ก ๊ธฐ๊ด€์— ์—ฐ๊ฒฐ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๋ ˆ์ง€์ŠคํŠธ๋ผ๊ฐ€ ์–ด์…ˆ๋ธ”๋ฆฌ ๊ฒ€์ƒ‰์„ ์ˆ˜ํ–‰ํ•˜๋„๋ก ์„ ํƒํ•œ ๊ฒฝ์šฐ DependencyService๊ฐ€ ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆ˜์ค€ ์†์„ฑ์„ ๊ฒ€์ƒ‰ํ•˜๋„๋ก ํŠธ๋ฆฌ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

์ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ์ฃผ์˜ํ•  ์  ์ค‘ ํ•˜๋‚˜๋Š” ์•ฑ์ด ์‹œ์ž‘๋œ ํ›„์—๋Š” ์œ ํ˜•์„ ์ฆ‰์‹œ ๋“ฑ๋กํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์œ ํ˜•์„ ์‹œ์ž‘ ํ”„๋กœ์„ธ์Šค์˜ ์ผ๋ถ€๋กœ ๋“ฑ๋กํ•œ ๋‹ค์Œ IServicePROvider๊ฐ€ ๊ตฌ์„ฑ๋˜๋ฉด ๊ทธ๊ฒƒ์œผ๋กœ ๋์ž…๋‹ˆ๋‹ค. ์‚ฌ์—… ๋“ฑ๋ก์ด ๋งˆ๊ฐ๋˜์—ˆ์Šต๋‹ˆ๋‹ค

์žฅ์ : ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ๊ฐ–์ถ˜ ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค.
๋‹จ์ : ์„ฑ๋Šฅ?

IServiceCollection์„ ๋‚ด๋ถ€ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‚ฌ์šฉํ•˜๊ณ  IServiceProvider๋ฅผ ๊ตฌํ˜„ํ•˜๋„๋ก DependencyService๋ฅผ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‚ฌ๋žŒ๋“ค์ด ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์›ํ•  ๊ฒฝ์šฐ ๋งค์šฐ ์Šฌ๋ฆผํ•œ ๊ธฐ๋Šฅ์ด ์—†๋Š” ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์›ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ๋žŒ๋“ค์ด ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

```C#
๊ณต๊ฐœ ํด๋ž˜์Šค DependencyService : IServiceProvider
{
}

๊ณต๊ฐœ ์ •์  ServiceCollectionExtensions
{
๊ณต๊ฐœ ์ •์  DependencyService ์ƒ์„ฑ(์ด IServiceCollection);
}
```

๊ณ ๋ ค ์‚ฌํ•ญ

์ด๊ฒƒ์ด ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž ์•ฑ ๊ฒฝํ—˜์— ์ „๋ฐ˜์ ์œผ๋กœ ์œ ์šฉํ•ฉ๋‹ˆ๊นŒ? ์‹ ๊ทœ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ๋นŒ๋“œ ํ˜ธ์ŠคํŠธ ์‹œ์ž‘ ๋ฃจํ”„๋ฅผ ์ดํ•ดํ•˜๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? Init๋งŒ ์‚ฌ์šฉํ•˜๋Š” ์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์„ค์ •์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž๋Š” ์„ค์ • ํŒŒ์ผ/configureservices/etc๋ฅผ ์„ค์ •ํ•˜์ง€ ์•Š๊ณ ๋„ ํ•„์š”ํ•œ ์ž‘์—…์„ ์‰ฝ๊ฒŒ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ฑ๋Šฅ

๋‚ด ํ…Œ์ŠคํŠธ์—์„œ ์ œํ•œ๋œ ํ…Œ์ŠคํŠธ์—์„œ Microsoft Hosting ๋น„ํŠธ๊ฐ€ ์‹œ์ž‘๋˜๋Š” ๋ฐ ์•ฝ 25ms๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” 25ms์— ๋Œ€ํ•ด ๋” ๊นŠ์ด ํŒŒ๊ณ ๋“ค์–ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๋˜๋Š” ํ•ด๋‹น ๋น„์šฉ์ด ์ด๋ฏธ ๋ฐœ์ƒํ•˜๊ฒŒ ๋  ๋‹ค๋ฅธ ์‹œ์ž‘ ๋น„์šฉ์˜ ์ผ๋ถ€์ธ์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•˜์œ„ ํ˜ธํ™˜์„ฑ

  • ํ˜„์žฌ DependencyService๋Š” .NET MAUI์— ๋Œ€ํ•œ ์˜ตํŠธ์ธ์œผ๋กœ ์ „ํ™˜๋  ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋†’์€ ์–ด์…ˆ๋ธ”๋ฆฌ ์ˆ˜์ค€ ํŠน์„ฑ์„ ๊ฒ€์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์„œ๋น„์Šค ์ปฌ๋ ‰์…˜์„ ํ†ตํ•ด ๋ช…์‹œ์ ์œผ๋กœ ๋“ฑ๋กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋‚œ์ด๋„ : ์ค‘/๋Œ€

๊ธฐ์กด ์ž‘์—…:
https://github.com/xamarin/Xamarin.Forms/pull/8220

breaking proposal-open

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์€ Microsoft.Extensions.DependencyInjection.Abstractions ํ”„๋กœ์ ํŠธ๋ฅผ Maui ๊ตฌํ˜„ ์ „๋ฐ˜์— ๊ฑธ์ณ ์ฃผ์š” ์ข…์†์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ์—๋งŒ ์‚ฌ์šฉ๋˜๋„๋ก Microsoft.Extensions.DependencyInjection ์˜ ๊ณต๊ฐ„์„ ์ค„์ž„์œผ๋กœ์จ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ Maui์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”์ƒํ™” ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์— ํ•„์š”ํ•œ ์ž‘์—…์€ ์ถ”์ƒํ™” ํ”„๋กœ์ ํŠธ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋งˆ์šฐ์ด ์ฝ”๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”Œ๋žซํผ์—์„œ ์ข…์†์„ฑ ์ฃผ์ž…์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์žฌ์ž‘์—…ํ•  ๋•Œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋Œ€๊ทœ๋ชจ ํ™•์žฅ ์ง€์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“  21 ๋Œ“๊ธ€

์ด๊ฒƒ์„ ๊ตฌํ˜„ํ•  ๋•Œ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์€ Microsoft.Extensions.DependencyInjection.Abstractions ํ”„๋กœ์ ํŠธ๋ฅผ Maui ๊ตฌํ˜„ ์ „๋ฐ˜์— ๊ฑธ์ณ ์ฃผ์š” ์ข…์†์„ฑ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปจํ…Œ์ด๋„ˆ ์ƒ์„ฑ์—๋งŒ ์‚ฌ์šฉ๋˜๋„๋ก Microsoft.Extensions.DependencyInjection ์˜ ๊ณต๊ฐ„์„ ์ค„์ž„์œผ๋กœ์จ ํƒ€์‚ฌ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ์ปจํ…Œ์ด๋„ˆ์— ๋Œ€ํ•ด ๋…๋ฆฝ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๊ฐœ๋ฐœ์ž ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ Maui์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”์ƒํ™” ํ”„๋กœ์ ํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ๋ฐœ์ž ๋˜๋Š” ํ”„๋ ˆ์ž„์›Œํฌ์— ํ•„์š”ํ•œ ์ž‘์—…์€ ์ถ”์ƒํ™” ํ”„๋กœ์ ํŠธ์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๋งˆ์šฐ์ด ์ฝ”๋“œ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”Œ๋žซํผ์—์„œ ์ข…์†์„ฑ ์ฃผ์ž…์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ์žฌ์ž‘์—…ํ•  ๋•Œ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋Œ€๊ทœ๋ชจ ํ™•์žฅ ์ง€์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

@ahoefling ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค . ๋งˆ์šฐ์ด๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์†Œ๋น„ํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์งˆ๋ฌธ์€ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ์œ„ํ•ด ์ด๋ฏธ ๊ตฌํ˜„๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์„ฑ๋Šฅ ๋ฉด์—์„œ ์กฐ๊ธˆ ๋” ๋ชจ๋ฐ”์ผ ์ง€ํ–ฅ์ ์ธ ์ž์ฒด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋กค๋งํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

@PureWeen ํ˜„์žฌ ๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ ๊ตฌํ˜„์€ ๋ชจ๋ฐ”์ผ์—์„œ ์ž˜ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ˜ธ์ŠคํŠธ ๋นŒ๋”๊ฐ€ ๊ฐ€์ ธ์˜ค๋Š” ์ข…์†์„ฑ ๋ฉ์–ด๋ฆฌ๋Š” ์–ด๋งˆ์–ด๋งˆํ•ฉ๋‹ˆ๋‹ค.

@PureWeen ์ •๋ง ์ž˜ ๋“ฃ์Šต๋‹ˆ๋‹ค!

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ ํ™•์žฅ ํ”„๋กœ์ ํŠธ ์ปจํ…Œ์ด๋„ˆ ์„ฑ๋Šฅ์€ ๊ฝค ๊ฒฌ๊ณ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ปจํ…Œ์ด๋„ˆ๋กœ ์‹œ์ž‘ํ•˜๊ณ  ์„ฑ๋Šฅ ํ…Œ์ŠคํŠธ๊ฐ€ ๊ธฐ๋Œ€์— ๋ฏธ์น˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ˜๋ณตํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ํ™•์žฅ ์ง€์ ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ƒ๊ฐํ–ˆ๋˜ ๊ฒƒ์— ๋Œ€ํ•œ ์ž‘์€ ์ฝ”๋“œ ์ƒ˜ํ”Œ์„ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ํ†ตํ•ด ๋‹ค๋ฅธ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž, ํ”„๋ ˆ์ž„์›Œํฌ ๋˜๋Š” Maui ํ”Œ๋žซํผ์—์„œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‰ฝ๊ฒŒ ๊ต์ฒดํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

System.Maui.Application ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
```c#
public class Application : Element, IResourcesProvider, IApplicationController, IElementConfiguration
{
๊ณต๊ฐœ IServiceProvider ์ปจํ…Œ์ด๋„ˆ { get; }

protected virtual IServiceProvider CreateContainer()
{
    var serviceCollection = new ServiceCollection();
    RegisterDependencies(serviceCollection);
    return serviceCollection.BuildServiceProvider();
}

// This should be implemented in the app code
protected virtual void RegisterDependencies(IServiceCollection serviceCollection)
{
    // TODO - Register dependencies in app code
}

public Application()
{
    Container = CreateContainer();

    // omited code
}

// omitted code

}
```

@ahoefling ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ๋žŒ๋“ค์ด ์ž์‹ ์˜ IServiceProvider๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

https://docs.microsoft.com/en-us/dotnet/api/microsoft.extensions.hosting.hostbuilder.useserviceproviderfactory?view=dotnet-plat-ext-3.1

AutoFac๊ณผ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ดํ•ดํ•˜๋Š” ํ•œ Host Builder๋Š” ๋กœ๊ทธ์•„์›ƒ๊ณผ ๊ฐ™์€ ๊ธฐ๋ณธ ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํ’๋ถ€ํ•œ API๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ๋œ ์ฝ”๋“œ๊ฐ€ ํ›จ์”ฌ ๋” ๊ฐ„๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์˜์กด์„ฑ ์ฃผ์ž…์œผ๋กœ ๋‹ค๋ฅธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‘ ์ ‘๊ทผ ๋ฐฉ์‹์ด ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ๋” '์˜ฌ๋ฐ”๋ฅธ' ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ ๋นŒ๋”
์ฝ˜์†” ๋กœ๊น…์ด ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ๋ฐœ์ƒํ•˜๊ณ  HttpClientFactory๊ฐ€ Host Builder๋ณด๋‹ค ํŠน์ • ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•  ๊ฒƒ์ด๋ผ๋Š” ์˜๊ฒฌ์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋งˆ๋„ ์ตœ์„ ์˜ ์„ ํƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ฆฐ ์„œ๋น„์Šค ์ปฌ๋ ‰์…˜
DI ์‹œ์Šคํ…œ์ด ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„๊ฒฐํ•˜๊ณ  ์•ฑ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์‹ ์—๊ฒŒ ๋งž๋Š” ๊ฒƒ๊ณผ ๊ทธ๋ ‡์ง€ ์•Š์€ ๊ฒƒ์„ ๊ฒฐ์ •ํ•˜๊ฒŒ ํ•˜๋ ค๋ฉด ์ œ๊ฐ€ ์ œ์•ˆํ•œ ์ฝ”๋“œ ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์ด ๊ตฌํ˜„ ๋ฐฉ๋ฒ•์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฌธ์ œ๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋ฐฉ์‹์€ DependencyService ๋ฅผ ๊ต์ฒดํ•˜๋Š” ๊ฐ€์žฅ ๋œ ์นจ์Šต์ ์ธ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์ตœ์ข… ๋ชฉํ‘œ๊ฐ€ asp.net ์ฝ”์–ด ๋ฐ ํ˜ธ์ŠคํŠธ ๋นŒ๋” ๋ชจ๋ธ์˜ ํŒจํ„ด์„ ๋”ฐ๋ฅด๋Š” ๊ฒƒ์ด๋ผ๋ฉด ํ˜ธ์ŠคํŠธ ๋นŒ๋”๋ฅผ ํ™œ์šฉํ•˜๋Š” Startup.cs ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

OP์˜ ์ฝ”๋“œ๋Š” ServiceProvider.GetService<MainPage>() ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹๊ณผ MainViewModel ๊ฐ€ ๋ฐœ๊ฒฌ๋˜๋Š” ๋ฐฉ์‹๊ณผ ๊ด€๋ จ๋œ ์œ ํ˜•์ด ๋ถˆ๋ถ„๋ช…ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ NRT ๊ฒฝ๊ณ ๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•ด์•ผ ํ•˜๋Š” null ๋„ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์ด ์œ ํ˜• ์‹œ์Šคํ…œ์„ ์šฐํšŒํ•˜๋Š” ๋ฐฉ๋ฒ•์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ASP.Net์€ ๊นจ๋—ํ•œ API์˜ ๋น›๋‚˜๋Š” ์˜ˆ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์ง€๊ธˆ์ฒ˜๋Ÿผ ์ด ๊ธฐ๋Šฅ์˜ ์‚ฌ์šฉ์„ ํ”ผํ•˜๊ณ  ์œ ํ˜•์ด ์•ˆ์ „ํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์ฒด๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ”ผํ•จ์œผ๋กœ์จ ์‚ฌ์šฉ์ž๋Š” ์„ฑ๋Šฅ ํŒจ๋„ํ‹ฐ๋ฅผ ์ง€๋ถˆํ•˜์ง€ ์•Š์•„๋„ ๋ฉ๋‹ˆ๋‹ค.

type App() =
    inherit Application()
    let vm = someMainViewModel(...)
    let mainPage = MainPage(vm)
    do  base.MainPage <- mainPage

์‚ฌ๋žŒ๋“ค์ด ๋ฆฌํ”Œ๋ ‰์…˜/์ปจ๋ฒค์…˜/์ฃผ์„ ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์œผ๋กœ ๋ทฐ ๋ชจ๋ธ์„ ์–ป์œผ๋ ค๋ฉด MAUI๊ฐ€ ์ •๋ง ๋ช…์‹œ์ ์ธ ์ง€์›์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ์–ด์จŒ๋“  ๊ทธ๋“ค์€ ์ด๊ฒƒ์„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ? ์›๋ž˜ ๋งํฌ ๋Š” ๊ทธ๋“ค์ด ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

@์•„ํ˜ธํ”Œ๋ง

ํ˜ธ์ŠคํŠธ ๋นŒ๋” ๋Œ€ ๋ฆฐ ServiceCollection

๋งž์Šต๋‹ˆ๋‹ค. ๋‘˜ ์ค‘ ํ•˜๋‚˜์˜ ์ด์ ์„ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์€ ํ™•์‹คํžˆ ์ด๊ฒƒ์˜ ํฐ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค!

์ฒ˜์Œ์—๋Š” Lean Service Collections๋งŒ ๋ณด๊ณ  ์žˆ์—ˆ์ง€๋งŒ ์˜ฌ์ธํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.
๋นŒ๋” ๋ฐฉํ–ฅ์„ ์‚ฌ์šฉํ•˜๋Š” ์ด์  ์ค‘ ์ผ๋ถ€๋Š” ๊ธฐ์กด ๋„ท์ฝ”์–ด ๊ตฌํ˜„๊ณผ ์—ฐ๊ฒฐ๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด AutoFac์„ ์‚ฌ์šฉํ•˜๋ฉด ์šฐ๋ฆฌ ์ž์‹ ์˜ ๊ฒƒ์„ ๋ฐœ๋ช…ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ๊ณผ ๋ฐ˜๋Œ€๋กœ ๋™์ผํ•œ ์‹œ์ž‘ ๋ฃจํ”„ ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋„๋ฉ”์ธ ์ง€์‹์€ ์–‘๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

@PureWeen ์ด๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋ฉฐ .NET 5+์˜ ํ†ตํ•ฉ๊ณผ ๋‹ค๋ฅธ ๋„๊ตฌ ๊ฐ„์˜ ์ด์ „ ๊ฐ€๋Šฅํ•œ ๊ธฐ์ˆ ์„ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์‹œ์ž‘ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” App.cs ๋˜๋Š” App.xaml.cs ๋ฐ”๋กœ ์˜†์— ์žˆ๋Š” Startup.cs ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งˆ์šฐ์ด์˜ ์˜์กด์„ฑ ์ฃผ์ž… ์ด์•ผ๊ธฐ๋ฅผ .NET ์ƒํƒœ๊ณ„์˜ ๋‹ค๋ฅธ ํ”„๋กœ์ ํŠธ์™€ ํ†ตํ•ฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ž‘๋…„์— DNN ๋ชจ๋“ˆ์—์„œ ์ข…์†์„ฑ ์ฃผ์ž…์„ ๊ตฌํ˜„ํ–ˆ์„ ๋•Œ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž์‹ ์˜ ๊ธฐ์ˆ ์„ ์•„์ฃผ ์‰ฝ๊ฒŒ ์ด์ „ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋น„์Šทํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  ์‹œ์ž‘ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” App.cs ๋˜๋Š” App.xaml.cs ๋ฐ”๋กœ ์˜†์— ์žˆ๋Š” Startup.cs๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‹ ๊ทœ ์‚ฌ์šฉ์ž๋Š” ์ด ๋ชจ๋“  ๋ถ€ํŠธ์ŠคํŠธ๋žฉ ์ž‘์—…์„ ์ดํ•ดํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” MAUI๊ฐ€ AppDelegate, MainActivity ๋“ฑ 1 startup/app.xaml ์ฃผ๋ณ€์˜ ๋ชจ๋“  ์ƒ์šฉ๊ตฌ๋ฅผ ์™„ํ™”ํ•˜์—ฌ ๋ชจ๋‘๋ฅผ ์ง€๋ฐฐํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์ด ํŠนํžˆ ๋‹น์‹ ์ด ์›ํ•˜๋Š” ๋งˆ์ง€๋ง‰ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

@aritchie ๋™์˜

๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์„ ํ™œ์„ฑํ™”ํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์‹ ๊ทœ ์‚ฌ์šฉ์ž์˜ ๊ฒฝ์šฐ ์ด ๋Œ€๋ถ€๋ถ„์ด ์ˆจ๊ฒจ์ ธ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ์ผ๋‹จ ๊ทธ๋“ค์ด ํŽธ์•ˆํ•ด์ง€๋ฉด ๋ฌผ๊ฑด์„ ํ™•์žฅํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์— ์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋“  ๊ฒƒ์„ ์‚ฌ์ง€ ์•Š๊ณ ๋„ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด Shell์„ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ RegisterRoute ๊ตฌ๋ฌธ์„ ๋„์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Shell.RegisterRoute<TBindingContext, TPage>(String routeName);
์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ
Shell.RegisterRoute<TType>();

ํ›„๋“œ ์•„๋ž˜์—์„œ ์ด ๋ชจ๋“  ๊ฒƒ์„ ์‚ฌ์šฉํ•˜์—ฌ ์œ ํ˜•์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž๊ฐ€ ๋“ฑ์— ์ฃผ์ž…๋  HttpContext๋ฅผ ์›ํ•˜๋Š” ๊ฒฝ์šฐ.

์ด ์ œ์•ˆ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ์žฌ๋ฏธ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๋Š” IServiceProvider๋ฅผ ํ†ตํ•ด ๋ชจ๋“  DataTemplate์„ ์‹œ๋„ํ•˜๊ณ  ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” James์˜ ์ƒ˜ํ”Œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ Shell๊ณผ ํ•จ๊ป˜ ๋ช‡ ๊ฐ€์ง€ ๋ณ€ํ˜•์„ ๊ฐ€์ง€๊ณ  ๋†€๊ณ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

https://github.com/PureWeen/AllExtensions-DI-IoC/tree/shell_ioc

@charlesroddie

์‚ฌ๋žŒ๋“ค์ด ๋ฆฌํ”Œ๋ ‰์…˜/์ปจ๋ฒค์…˜/์ฃผ์„ ๊ธฐ๋ฐ˜ ๋ฐฉ์‹์œผ๋กœ ๋ทฐ ๋ชจ๋ธ์„ ์–ป์œผ๋ ค๋ฉด MAUI๊ฐ€ ์ •๋ง ๋ช…์‹œ์ ์ธ ์ง€์›์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

ํ˜„์žฌ๋กœ์„œ๋Š” ์„ฑ๋Šฅ์ƒ์˜ ์ด์œ ๋กœ ๋ฐ˜์˜์„ ํ†ตํ•ด ์•„๋ฌด๊ฒƒ๋„ ์ œ๊ณตํ•˜์ง€ ์•Š์„ ๊ณ„ํš์ž…๋‹ˆ๋‹ค. ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด ๋“ฑ๋ก์„ ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ถ€ ์˜์—ญ์ด ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ์ด๋Ÿฌํ•œ ์˜์—ญ์„ ํƒ์ƒ‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ๋“ฑ๋ก ๊ตฌ๋ฌธ์œผ๋กœ ์›๋ž˜ ์ฃผ์„์„ ์—…๋ฐ์ดํŠธํ–ˆ์Šต๋‹ˆ๋‹ค.

@PureWeen

Prism๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ๋ชจ๋ธ์— ํ”Œ๋Ÿฌ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋„๋ก IServiceCollection์—์„œ ์ผ์ข…์˜ ๊ฒฝ๋กœ ํ™•์žฅ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ์ €๋Š” XF๋ฅผ ์ˆ˜๋…„๊ฐ„ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ Shell์€ ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฆ‰. services.UseRoute(์„ ํƒ์  ์ด๋ฆ„)

๋‹ค๋ฅธ ์ฐธ๊ณ  ์‚ฌํ•ญ์œผ๋กœ Shiny๋Š” ๋‹ค๋ฅธ ์•„์ด๋””์–ด๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ Microsoft DI ๋ฉ”์ปค๋‹ˆ์ฆ˜๊ณผ ๊ด€๋ จํ•˜์—ฌ ๊ด‘๋ฒ”์œ„ํ•˜๊ฒŒ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ˜ธ์ŠคํŠธ ๋นŒ๋” ๋ชจ๋ธ(ํ˜„์žฌ ํ˜•ํƒœ์˜)์„ ๊ฑฐ๋ถ€ํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ, ๊ทธ ์ด์œ ๋Š” ๋ง์ปค์™€์˜ ๋”์ฐํ•œ ์‹ธ์›€์œผ๋กœ ์ด์–ด์ง€๋Š” ๋งŽ์€ ๊ฒƒ๋“ค์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์–ธ์  ๊ฐ€๋Š” ์ „ํ™”๋กœ ์ด๋Ÿฌํ•œ ๊ฒฝํ—˜์„ ๊ณต์œ ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์†Œ์Šค ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ฑ๋Šฅ ๋ฌธ์ œ๋ฅผ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž ์ •์˜ ์†์„ฑ์„ ๊ณ„์† ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ƒ์„ฑ๋œ ์†Œ์Šค ํŒŒ์ผ์—์„œ ๋ชจ๋“ (๊ธฐ๋ณธ๊ฐ’) ๋“ฑ๋ก์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

@aritchie๋Š” ์ข‹์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค!

์ผ๋‹จ ์šฐ๋ฆฌ๊ฐ€ ์žฌ๋ฏธ์žˆ๋Š” ๋นŒ๋“œ์˜ ๋ฐ˜๋Œ€ํŽธ์— ์žˆ์œผ๋ฉด ์ฑ„ํŒ…ํ•ฉ์‹œ๋‹ค!

@rogihee

์•„๋งˆ๋„ ์†Œ์Šค ์ƒ์„ฑ๊ธฐ

์‘!! ์šฐ๋ฆฌ๋Š” Maui ์ด์ „์— ํ˜„์žฌ ๋ Œ๋”๋Ÿฌ ๋“ฑ๋ก์„ ์žฌ๊ตฌ์„ฑํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉฐ ํ•ด๋‹น ์ž‘์—…์„ ์œ„ํ•œ ์†Œ์Šค ์ƒ์„ฑ๊ธฐ๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ทธ ๊ธธ์„ ๊ฐ„๋‹ค๋ฉด ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ์œ„ํ•ด ํ™•์‹คํžˆ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

Xamarin Forms์— DI๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹๊ฒ ์ง€๋งŒ DI ๋ฒ”์œ„์— ๋Œ€ํ•œ ๋‚ด์šฉ์€ ์ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. DI ๋ฒ”์œ„๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ ๊ตฌ์„ฑ ์š”์†Œ์˜ ์ˆ˜๋ช…์„ ๊ด€๋ฆฌํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. EF ์ฝ”์–ด์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ปจํ…์ŠคํŠธ๋กœ ์ž‘์—…ํ•  ๋•Œ ํŠนํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๋ฒ”์œ„๋ฅผ ๋งŒ๋“ค๊ณ  ์ด ๋ฒ”์œ„์— ๋Œ€ํ•œ ๋ช…๋ น ์ฒ˜๋ฆฌ๊ธฐ ๊ฐœ์ฒด๋ฅผ ์š”์ฒญํ•˜๋Š” DI ์ธ์‹ ICommand ๊ตฌํ˜„์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

WPF ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์ข…์†์„ฑ ์ฃผ์ž…์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋„ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ WPF ํŒ€๊ณผ ํŒ€์„ ์ด๋ฃจ์–ด ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ WPF์—์„œ DI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์œ ์ผํ•œ ์งˆ๋ฌธ์€ ๊ธฐ๋ณธ ๊ตฌํ˜„์„ ์œ„ํ•ด ์ด๋ฏธ ๊ตฌํ˜„๋œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ์„ฑ๋Šฅ ๋ฉด์—์„œ ์กฐ๊ธˆ ๋” ๋ชจ๋ฐ”์ผ ์ง€ํ–ฅ์ ์ธ ์ž์ฒด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋กค๋งํ•ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

๋งˆ์šฐ์ด์šฉ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๊ตฌํ˜„ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด DependecyService ๊ตฌํ˜„๋œ Xamarin.Forms ๊ฐ€ ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค. (์•Œ์•„์š”... ๊ทธ ๊ธ€์€ ์ข€ ์˜ค๋ž˜๋œ ๊ธ€์ด์ง€๋งŒ ๊ฐ€์น˜๊ด€์ด ๋งŽ์ด ๋ฐ”๋€Œ๋Š” ๊ฒƒ ๊ฐ™์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.)
๋˜ํ•œ ์„ฑ๋Šฅ ๋ฉด์—์„œ ์ž์ฒด DI ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ์ข‹์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ ๊ฑฑ์ •์€ .NET 5๊ฐ€ ์—†๋Š” ์„ธ์ƒ์ž…๋‹ˆ๋‹ค. .NET 5์™€ ์†Œ์Šค ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ชจ๋ฐ”์ผ ์˜ ๊ฒฝ์šฐ ๋ฌด๊ฑฐ์šด DI๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๋ญ”๊ฐ€ ์ž˜๋ชปํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ €๋Š” MAUI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์ผ๋ฐ˜ ํ˜ธ์ŠคํŠธ(Microsoft.Extensions.Hosting)๋ฅผ ์ง€์›ํ•˜๋„๋ก ์ œ์•ˆํ•˜๊ธฐ ์œ„ํ•ด ์ด ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์™”์Šต๋‹ˆ๋‹ค. UI ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— DI๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด ๋งค์šฐ ์ž์—ฐ์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค(์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ๋ณดํ˜ธํ•˜๊ธฐ๋ฅผ ์›ํ•  ์ˆ˜๋„ ์žˆ์Œ). ์ด๋Š” ์‚ฌ๋žŒ๋“ค์ด asp.net ์ฝ”์–ด์— ๋Œ€ํ•œ ์ข…์†์„ฑ ์ฃผ์ž…์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด MAUI์—์„œ๋„ ์ž‘๋™ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋œ ์ดํ•ดํ•  ํ•„์š”๊ฐ€ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ดˆ๋ณด์ž์˜ ๊ฒฝ์šฐ ๊ตฌ์„ฑ์„ ๋งค์šฐ ์ตœ์†Œํ•œ์œผ๋กœ ์œ ์ง€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๊ฐ€ ๋˜๋Š” ๋Œ€์‹  ์ด ๋ฌธ์ œ๋ฅผ ์ฐพ์•˜๊ณ  ์ข‹์€ ํ† ๋ก ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค!

์ผ๋ถ€ ์„œ๋น„์Šค์™€ ์ž‘์€ UI(์ƒํƒœ, ๊ตฌ์„ฑ ๋“ฑ)๋ฅผ ์ œ๊ณตํ•˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์ผ๋ฐ˜์ ์ธ ์ผ์ž…๋‹ˆ๋‹ค. ์ผ๋ถ€ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ์ž‘์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•  ๋•Œ๋งˆ๋‹ค UI๋กœ ์ด๋ฅผ ํ™•์žฅํ•ด์•ผ ํ•  ํ•„์š”์„ฑ์„ ๊ณ„์† ๋Š๋‚๋‹ˆ๋‹ค.

https://github.com/dapplo/Dapplo.Microsoft.Extensions.Hosting ํ”„๋กœ์ ํŠธ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด Windows Forms ๋ฐ WPF ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ผ๋ฐ˜ ํ˜ธ์ŠคํŠธ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ด๋ฏธ ๋นŒ๋“œํ–ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ์ด๊ฒƒ์„ Greenshot์— ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž์ง€๋งŒ, ํ˜„์žฌ ๋‚˜๋Š” ์•„์ง ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ๋ฐœํ‘œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
์ƒ˜ํ”Œ์—๋Š” ReactiveUI, MahApps ๋ฐ Caliburn.Micro๋ฅผ ์‚ฌ์šฉํ•˜๋Š” WPF ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

DI์— ์ˆ˜๋™์œผ๋กœ ๋ณด๊ธฐ๋ฅผ ๋“ฑ๋กํ•˜๊ฒŒ ํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค. blazor์—์„œ ์ตœ๊ณ ๋ฅผ ์–ป์œผ์‹ญ์‹œ์˜ค. ํ›Œ๋ฅญํ•ฉ๋‹ˆ๋‹ค! blazor์—์„œ๋Š” ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‰ฝ๊ฒŒ ์ „๋‹ฌํ•˜๊ฑฐ๋‚˜ ๊ตฌ์„ฑ ์š”์†Œ์— ์„œ๋น„์Šค๋ฅผ ์ฃผ์ž…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์ฒด ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๋“ฑ๋กํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์„œ๋น„์Šค๋งŒ ๋“ฑ๋กํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. MVVM์€ ํŽ˜์ด์ง€์— ์ ํ•ฉํ•˜์ง€๋งŒ ์ด๋Ÿฌํ•œ ์ž์ฒด ํ˜ธ์ŠคํŒ… ๊ตฌ์„ฑ ์š”์†Œ ๋ณด๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๋” ์ƒ์‚ฐ์ ์ด๋ผ๊ณ  ๋Š๋‚€ ์ ์€ ์—†์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š๋Š” ๊ฒƒ๋“ค ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด Xamarin, WPF, UWP ํ”„๋กœ์ ํŠธ๋ฅผ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์‹ซ์–ดํ•ฉ๋‹ˆ๋‹ค. ๋ฏธ๋ž˜์˜ ๋ชจ๋“  GUI ํ”„๋ ˆ์ž„์›Œํฌ์— ๋Œ€ํ•œ ์ง„์ •ํ•œ ์ฒญ์‚ฌ์ง„์ธ Blazor๋ฅผ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‚ดํŽด๋ณด์‹ญ์‹œ์˜ค.

์™œ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‘ ๊ฐ€์ง€ ์—ฐ์†์ ์ธ ์ง„์ˆ ์„ ์ž‘์„ฑํ•˜๋Š”์ง€ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

    services.AddTransient<IMainViewModel, MainViewModel>();
    services.AddTransient<MainPage>();

๋ทฐ ์ฝ”๋“œ ๋’ค์— ์„œ๋น„์Šค๋ฅผ ์ฃผ์ž…ํ•˜๋Š” ๊ฒƒ์ด ์ž˜๋ชป๋œ ๊ฒƒ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? 99.99%์˜ ์‹œ๊ฐ„ ๋™์•ˆ ์›ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์ €๋Š” ์ƒ์„ฑ์ž ์ฃผ์ž… ๋Œ€์‹  blazor์˜ ์†์„ฑ ์ฃผ์ž…์ด ๋” ์‰ฝ๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ Xamarin.Forms https://github.com/hostly-org/hostly ์— ๋Œ€ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋ฐฉ๊ธˆ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ์ง„์ž…์ ์—์„œ ์‰ฝ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” IHost์˜ ์‚ฌ์šฉ์ž ์ง€์ • ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด MainActivity ๋‹ค์Œ์„ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

LoadApplication(new App());`

์™€ ํ•จ๊ป˜:

new XamarinHostBuilder().UseApplication<App>()
   .UseStartup<Startup>()
   .UsePlatform(this)
   .Start();

๋˜ํ•œ ํƒ์ƒ‰์— ๋ฏธ๋“ค์›จ์–ด๋ฅผ ๋“ฑ๋กํ•˜๊ธฐ ์œ„ํ•œ ์ง€์›๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ €๋Š” ์ฝ”๋“œ๋ฅผ MAUI ๋ฐ ๋น„ MAUI ํ”„๋กœ์ ํŠธ์™€ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก System.Maui ๋„ค์ž„์ŠคํŽ˜์ด์Šค ์™ธ๋ถ€์— ์žˆ๋Š” DI ์‹œ์Šคํ…œ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ์ฐฌ์„ฑํ•ฉ๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋œ ํ™•์‹ ํ•˜๋Š” ๋ถ€๋ถ„์€ Microsoft.Extensions.DependencyInjection ๋˜๋Š” ์ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์„ DI ์‹œ์Šคํ…œ์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์— ๋Œ€ํ•ด ์ „๋ฌธ๊ฐ€์ธ ์ฒ™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ™•์‹คํžˆ ์—ฌ๋Ÿฌ ํ˜„๋Œ€ DI ์‹œ์Šคํ…œ์„ ์ง์ ‘ ์‚ฌ์šฉํ•ด ๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค์€ "Dependency Injection. Principles, Practices and Patternsโ€(Steven van Deursen๊ณผ Mark Seemann ์ €). ๊ทธ๋“ค์€ Autofac, Simple Injector ๋ฐ Microsoft.Extensions.DependencyInjection์„ ์‚ดํŽด๋ณด๋Š” ๋ฐ ๋‘ ๋ฒˆ์งธ ํŒ์˜ ์„น์…˜์„ ํ• ์• ํ•˜๊ณ , ์ž์‹ ์˜ ์˜๊ฒฌ/๊ฒฐ๋ก ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์žฅ๋‹จ์ ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. MAUI ์„ธ๊ณ„์—์„œ Microsoft.Extensions.DependencyInjection(์ฃผ๋กœ ๋‹ค๋ฅธ Microsoft ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์‚ฌ์šฉ๋จ)์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ช‡ ๊ฐ€์ง€ ์ด์ ์„ ๋ณผ ์ˆ˜ ์žˆ์ง€๋งŒ, ์—ฌ๊ธฐ์—์„œ ์—ฌ๋Ÿฌ DI ์‹œ์Šคํ…œ ๊ฒฝํ—˜์ด ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์ž‘์„ฑ์ž์˜ ๊ฒฐ๋ก ๊ณผ ์–ด๋Š ์ •๋„์— ๋Œ€ํ•ด ๋…ผํ‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋ฐ”์ผ ๋ฐ ๋ฐ์Šคํฌํƒ‘ ์‚ฌ์šฉ์˜ MAUI ์„ธ๊ณ„์™€ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

handicraftsman picture handicraftsman  ยท  4์ฝ”๋ฉ˜ํŠธ

ghost picture ghost  ยท  7์ฝ”๋ฉ˜ํŠธ

Suplanus picture Suplanus  ยท  4์ฝ”๋ฉ˜ํŠธ

mhrastegary77 picture mhrastegary77  ยท  3์ฝ”๋ฉ˜ํŠธ

Yaroslav08 picture Yaroslav08  ยท  6์ฝ”๋ฉ˜ํŠธ