https://montemagno.com/add-asp-net-cores-dependency-injection-into-xamarin-apps-with-hostbuilder/
.netcore 3.0์ผ๋ก ์ค์ ๋ ์ผ๋ฐ ํธ์คํธ ๊ตฌ์กฐ๋ฅผ ํ์ฉํ์ฌ .NET MAUI ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๊ธฐํํฉ๋๋ค.
์ด๊ฒ์ ์ฌ์ฉ์์๊ฒ ๋งค์ฐ Microsoft ๊ฒฝํ์ ์ ๊ณตํ๊ณ ASP.NET ์ฝ์ด์ ์ผ์นํ๋ ๋ง์ ์ฝ๋๋ฅผ ๊ฐ์ ธ์ฌ ๊ฒ์ ๋๋ค.
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
{
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" />
ํธ์คํธ ๊ธฐ๋ฅ์ ๊ฐ์ ธ์ ์ฌ๋ฌผ์ด ๋ฑ๋ก๋ ํน์ ์์ ์์น๋ฅผ ๋ช
ํํ ํฉ๋๋ค.
https://montemagno.com/add-asp-net-cores-dependency-injection-into-xamarin-apps-with-hostbuilder/
์ด๋ ์ด๋ฏธ asp.net ์ฝ์ด์ ๋ํด ์๋ํ๋ IoC ์ปจํ ์ด๋ ๊ตฌํ์ ์ฐ๊ฒฐํ ์ ์๋ค๋ ์ด์ ์ด ์์ต๋๋ค.
์ฅ์ : ์ด๋ .NET ๊ฐ๋ฐ์์๊ฒ ์ผ๊ด๋ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
๋จ์ : ์ฑ๋ฅ? ๋ชจ๋ฐ์ผ์์๋ ์ด๊ฒ ๊ณผํ๊ฑด๊ฐ์?
Xamarin.Forms์๋ ํ์ฌ ๋ง์ ๊ธฐ๋ฅ์ด ์ ๊ณต๋์ง ์๋ ๋งค์ฐ ๊ฐ๋จํ ์์ฒด ๊ฐ๋ฐ ์ข
์์ฑ ์๋น์ค๊ฐ ์์ต๋๋ค. ์ด๋ฏธ ์ฌ์ฉ ๊ฐ๋ฅํ ์ต์
์ ์ง๋ฉดํ์ฌ ์ด ์๋น์ค์ ๊ธฐ๋ฅ์ ํ์ฅํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๋ค๋ฅธ Microsoft ํ๋ซํผ๊ณผ ๋ณด๋ค ์ ์ ํ๊ฒ ์กฐ์ ํ๊ธฐ ์ํด Microsoft.Extensions.DependencyInjection
๋ด๋ถ์ ์ปจํ
์ด๋๋ก ์ ํํ ์ ์์ต๋๋ค.
DependencyService์ ์๋ ๋ฑ๋ก์ ์ ๋ฑ๋ก ๊ธฐ๊ด์ ์ฐ๊ฒฐ๋ฉ๋๋ค. ์ฌ์ฉ์๊ฐ ๋ ์ง์คํธ๋ผ๊ฐ ์ด์ ๋ธ๋ฆฌ ๊ฒ์์ ์ํํ๋๋ก ์ ํํ ๊ฒฝ์ฐ DependencyService๊ฐ ์ด์ ๋ธ๋ฆฌ ์์ค ์์ฑ์ ๊ฒ์ํ๋๋ก ํธ๋ฆฌ๊ฑฐํฉ๋๋ค.
์ด ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ ๋ ์ฃผ์ํ ์ ์ค ํ๋๋ ์ฑ์ด ์์๋ ํ์๋ ์ ํ์ ์ฆ์ ๋ฑ๋กํ ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ์ ํ์ ์์ ํ๋ก์ธ์ค์ ์ผ๋ถ๋ก ๋ฑ๋กํ ๋ค์ IServicePROvider๊ฐ ๊ตฌ์ฑ๋๋ฉด ๊ทธ๊ฒ์ผ๋ก ๋์ ๋๋ค. ์ฌ์ ๋ฑ๋ก์ด ๋ง๊ฐ๋์์ต๋๋ค
์ฅ์ : ๋ชจ๋ ๊ธฐ๋ฅ์ ๊ฐ์ถ ์ปจํ
์ด๋์
๋๋ค.
๋จ์ : ์ฑ๋ฅ?
์ด๊ฒ์ ์ฌ๋๋ค์ด ์ต๊ณ ์ ์ฑ๋ฅ์ ์ํ ๊ฒฝ์ฐ ๋งค์ฐ ์ฌ๋ฆผํ ๊ธฐ๋ฅ์ด ์๋ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํด์ค๋๋ค. ์ฐ๋ฆฌ๋ ์ด๊ฒ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์๊ณ ์ํ๋ ๊ฒฝ์ฐ ์ฌ๋๋ค์ด ๋ ๋ง์ ๊ธฐ๋ฅ์ ์ ํํ ์ ์์ต๋๋ค.
```C#
๊ณต๊ฐ ํด๋์ค DependencyService : IServiceProvider
{
}
๊ณต๊ฐ ์ ์ ServiceCollectionExtensions
{
๊ณต๊ฐ ์ ์ DependencyService ์์ฑ(์ด IServiceCollection);
}
```
์ด๊ฒ์ด ์๋ก์ด ์ฌ์ฉ์ ์ฑ ๊ฒฝํ์ ์ ๋ฐ์ ์ผ๋ก ์ ์ฉํฉ๋๊น? ์ ๊ท ์ฌ์ฉ์๋ฅผ ์ํ ๋น๋ ํธ์คํธ ์์ ๋ฃจํ๋ฅผ ์ดํดํ๋ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ต๋๊น? Init๋ง ์ฌ์ฉํ๋ ์ด ๋ชจ๋ ๊ฒ์ ๋ํ ๊ธฐ๋ณธ ์ค์ ์ ๊ฐ๋ ๊ฒ์ด ์ ์ฉํ ๊ฒ์ ๋๋ค. ๊ทธ๋ฌ๋ฉด ์๋ก์ด ์ฌ์ฉ์๋ ์ค์ ํ์ผ/configureservices/etc๋ฅผ ์ค์ ํ์ง ์๊ณ ๋ ํ์ํ ์์ ์ ์ฝ๊ฒ ์ํํ ์ ์์ต๋๋ค.
๋ด ํ ์คํธ์์ ์ ํ๋ ํ ์คํธ์์ Microsoft Hosting ๋นํธ๊ฐ ์์๋๋ ๋ฐ ์ฝ 25ms๊ฐ ๊ฑธ๋ฆฝ๋๋ค. ์ฐ๋ฆฌ๋ 25ms์ ๋ํด ๋ ๊น์ด ํ๊ณ ๋ค์ด ํด๊ฒฐํ ์ ์๋์ง ๋๋ ํด๋น ๋น์ฉ์ด ์ด๋ฏธ ๋ฐ์ํ๊ฒ ๋ ๋ค๋ฅธ ์์ ๋น์ฉ์ ์ผ๋ถ์ธ์ง ํ์ธํ๊ณ ์ถ์ ๊ฒ์ ๋๋ค.
๊ธฐ์กด ์์
:
https://github.com/xamarin/Xamarin.Forms/pull/8220
์ด๊ฒ์ ๊ตฌํํ ๋ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์ 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๋ฅผ ๋ง๋ค ์ ์์ต๋๊น?
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 ์ธ๊ณ์ ๊ด๋ จ์ด ์์ต๋๊น?
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ด๊ฒ์ ๊ตฌํํ ๋ ๊ณ ๋ คํด์ผ ํ ์ฌํญ์
Microsoft.Extensions.DependencyInjection.Abstractions
ํ๋ก์ ํธ๋ฅผ Maui ๊ตฌํ ์ ๋ฐ์ ๊ฑธ์ณ ์ฃผ์ ์ข ์์ฑ์ผ๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๋๋ค. ์ปจํ ์ด๋ ์์ฑ์๋ง ์ฌ์ฉ๋๋๋กMicrosoft.Extensions.DependencyInjection
์ ๊ณต๊ฐ์ ์ค์์ผ๋ก์จ ํ์ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฐ ํ๋ ์์ํฌ๊ฐ ์ปจํ ์ด๋์ ๋ํด ๋ ๋ฆฝ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.์ด๋ฅผ ํตํด ๊ฐ๋ฐ์ ๋๋ ํ๋ ์์ํฌ๊ฐ Maui์์ ์ ๊ณตํ๋ ๊ฒ๊ณผ ๋ค๋ฅธ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์ถ์ํ ํ๋ก์ ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ๋ฐ์ ๋๋ ํ๋ ์์ํฌ์ ํ์ํ ์์ ์ ์ถ์ํ ํ๋ก์ ํธ์์ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๋ ๊ฒ์ ๋๋ค. ๋ชจ๋ ๋ง์ฐ์ด ์ฝ๋๋ ์ธํฐํ์ด์ค๋ง ์ฌ์ฉํฉ๋๋ค. ์ด๋ ํ๋ซํผ์์ ์ข ์์ฑ ์ฃผ์ ์ด ์๋ํ๋ ๋ฐฉ์์ ์ฌ์์ ํ ๋ ๋ชจ๋ ์ฌ๋์๊ฒ ๋๊ท๋ชจ ํ์ฅ ์ง์ ์ ์ ๊ณตํฉ๋๋ค.