WPF IoC Container ์„ ํƒ

์ง€๊ธˆ๊นŒ์ง€ IoC Container๋ฅผ ์“ฐ๊ธฐ ์‹œ์ž‘ํ•œ ๋’ค๋กœ ์ญ‰ Microsoft.Extensions.DependencyInjection์„ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๊ฒƒ์„ WPF๋‚˜ Windows Forms ์จ๋ณด์‹  ๋ถ„๋“ค์„ ์•„์‹คํ…๋ฐ AddScoped()๋ฅผ ํ™œ์šฉํ•˜๊ธฐ๊ฐ€ ํž˜๋“ญ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์• ์ดˆ์— Microsoft.Extensions.DependencyInjection๊ฐ€ aspnetcore๋ฅผ ์—ผ๋‘ํ•˜๊ณ  ๋งŒ๋“ค์–ด์กŒ๊ธฐ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

aspnetcore์—์„œ AddScoped๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด web session ๋‹จ์œ„๋กœ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋ƒฅ ์“ฐ๊ฒŒ ๋œ๋‹ค๋ฉด ์•„๋ž˜์ฒ˜๋Ÿผ Scope๋ฅผ ์žก์•„์„œ ์“ฐ๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

using (IServiceScope scope = serviceProvider.CreateScope()) {
    var singletonService = scope.ServiceProvider.GetService<SingletonOperation>();  
    var scopedService = scope.ServiceProvider.GetService<ScopedOperation>();  
    var transientService = scope.ServiceProvider.GetService<TransientOperation>();  
} 

์ฝ”๋“œ ์ถœ์ฒ˜: c# - Dependency injection using Services with Microsoft.Extensions.DependencyInjection library - Stack Overflow

์‚ฌ์‹ค ์ €๋ ‡๊ฒŒ๊นŒ์ง€ ์จ๋ณธ์ ์€ ์—†์–ด์„œ Windows Desktop Application ๋‹จ์—์„œ ๋ฌด์Šจ ์˜๋ฏธ์ธ๊ฐ€ ์‹ถ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

ํ•˜์—ฌ,

ํ˜น์‹œ WPF๋ฅผ ์“ฐ์‹ค ๋•Œ Microsoft.Extensions.DependencyInjection ๋˜๋Š” Microsoft.Extensions.Hosting ์„ ๋ง๊ณ  ๋‹ค๋ฅธ IoC Container ๋ฅผ ์“ฐ์‹œ๋Š” ๋ถ„๋“ค ๊ณ„์‹ค๊นŒ์š”?

์ œ๊ฐ€ ์ด๋ฆ„์ด๋ผ๋„ ๋“ค์–ด๋ณธ IoC Container๋Š” ์•„๋ž˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ •๋„์ž…๋‹ˆ๋‹ค.

AutoFac์€ ์‚ฌ์‹ค์ƒ .NET์—์„œ Microsoft.Extensions.DependencyInjection๊ณผ ๋น„๋นŒ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ๊ฑฐ๋Œ€ํ•œ IoC Container๋ผ ๋ฏฟ์Œ์ง์Šค๋Ÿฝ๊ณ  ์ตœ๊ทผ๊นŒ์ง€๋„ ์—…๋ฐ์ดํŠธ๊ฐ€ ํ™œ๋ฐœํ•˜๊ฒŒ ์ด๋ค„์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ ๋ฐ–์—๋Š” DryIoC ๋Š” Prism์—์„œ ์ฃผ๋กœ ์“ฐ๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ๊ณ , Simple Injector๋Š” DevExpress์—์„œ Sample Project๋ฅผ ์ œ๊ณต๋ฐ›์„ ๋•Œ ์ฃผ๋กœ ์ ์šฉ๋˜์–ด ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , Ninject๋Š” ๋ช‡๋…„ ์ „์— ๋ฐ˜์ง ๋–ด๋˜ ๊ฒƒ ๊ฐ™์€๋ฐ ์ง€๊ธˆ์€ ์—…๋ฐ์ดํŠธ๊ฐ€ ์•ˆ๋˜๋Š” ๋“ฏํ•˜๊ณ , Splat์€ ReactiveUI ์ „์šฉ์ด๋ผ RxUI๋ฅผ ์•ˆ์“ฐ๋ฉด ์ ์šฉํ•˜๊ธฐ ์–ด๋ ค์šธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ˜น์‹œ WPF์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ์— ์ ํ•ฉํ•˜๊ณ  ์ถ”์ฒœํ• ๋งŒํ•œ IoC Container ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ถ”์ฒœ๋ถ€ํƒ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.


์ถ”๊ฐ€๋กœ ์ œ๊ฐ€ ์•ˆ ์จ๋ด์„œ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ Claude Sonnet 4๋Š” ์•„๋ž˜์™€ ๊ฐ™์ด ๋งํ•ด์ค๋‹ˆ๋‹ค.

์ „์ฒด IoC Container ๋น„๊ตํ‘œ

์ปจํ…Œ์ด๋„ˆ ์„ฑ๋Šฅ ๊ธฐ๋Šฅ ๋ฒ”์œ„ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰ ํ•™์Šต ๊ณก์„  ํŠน์ง•
MS.Extensions.DI ๋ณดํ†ต ๊ธฐ๋ณธ ๋‚ฎ์Œ ์‰ฌ์›€ .NET ํ‘œ์ค€, Generic Host ํ†ตํ•ฉ
Autofac ๋ณดํ†ต ๋งค์šฐ ๋†’์Œ ๋†’์Œ ๋ณดํ†ต ๋ชจ๋“ˆํ™”, ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ด ํ’๋ถ€
DryIoC ๋งค์šฐ ๋†’์Œ ๋†’์Œ ๋งค์šฐ ๋‚ฎ์Œ ๋ณดํ†ต ์ตœ๊ณ  ์„ฑ๋Šฅ, ์กฐ๊ฑด๋ถ€ ๋“ฑ๋ก
Splat ๋‚ฎ์Œ ๋‚ฎ์Œ ๋‚ฎ์Œ ์‰ฌ์›€ ReactiveUI ์ „์šฉ
Ninject ๋‚ฎ์Œ ๋†’์Œ ๋ณดํ†ต ์‰ฌ์›€ Fluent API, AOP ์ง€์›
Simple Injector ๋†’์Œ ๋†’์Œ ๋‚ฎ์Œ ๋ณดํ†ต ์ง„๋‹จ ๊ธฐ๋Šฅ, ์—„๊ฒฉํ•œ ์„ค๊ณ„
6๊ฐœ์˜ ์ข‹์•„์š”

WPF์—์„œ Scope ์˜ ๊ฐœ๋… ์ž์ฒด๊ฐ€ ํ•„์š”ํ•œ๊ฐ€์š”?

์›น์•ฑ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์š”์ฒญ์ด ๋“ค์–ด์™€์•ผ ๋ญ”๊ฐ€๊ฐ€ ๋Œ์•„๊ฐ€๋Š” ์•ฑ์ด๋ผ์„œ, ์˜์กด์„ฑ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ๋ฅผ ์š”์ฒญ ์„ธ์…˜์œผ๋กœ ํ•œ์ •ํ•˜๋Š” Scope๊ฐ€ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
์ฆ‰, ์š”์ฒญ ์„ธ์…˜ ๋™์•ˆ์—๋Š” Singlton ์ธ ๊ฒƒ์ด์ฃ .

๊ทธ๋Ÿฌ๋‚˜, ๋ฐ์Šคํฌํƒ‘ ์•ฑ์ด๋‚˜ ํ”„๋ก ํŠธ ์•ฑ์€ ์„ธ์…˜ ๊ฐœ๋…์ด ์—†์–ด์„œ, Scoped ์ƒ๋ช… ์ฃผ๊ธฐ๊ฐ€ ํฐ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.(์ œ๊ฐ€ ์•„๋Š” ํ•œ)

์•ฑ์˜ ์ƒ๋ช… ์ฃผ๊ธฐ(์‹œ์ž‘ ~ ์ข…๋ฃŒ) ๋™์•ˆ Singleton ์ด๋ƒ Transient ๋ƒ์˜ ๊ตฌ๋ถ„๋งŒ ์ค‘์š”ํ•˜์ฃ .

๊ทธ๋ฆฌ๊ณ , ์•„๋ž˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ, ์ž„์˜์˜ Scope๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ํŠน๋ณ„ํ•œ ์ด์œ ๊ฐ€ ์žˆ์ง€ ์•Š๋Š” ํ•œ ๋ถˆํ•„์š”ํ•œ ๋ณต์žก์„ฑ์ž…๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ, Scoped ๋กœ ๋“ฑ๋ก๋˜์–ด ์žˆ์ง€๋งŒ ์ƒ๋ช…์ฃผ๊ธฐ๋Š” Transient ์™€ ๊ฐ™(๊ฑฐ๋‚˜ ์งง)์Šต๋‹ˆ๋‹ค. using ์˜ ๋ฒ”์œ„๊ฐ€ ๋๋‚˜๋ฉด, Scope ๋„ ์‚ฌ๋ผ์ง€๊ณ , ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ฐ์ฒด๋„ ์‚ฌ๋ผ์ง€๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

7๊ฐœ์˜ ์ข‹์•„์š”

์ €๊ฐ™์€ ๊ฒฝ์šฐ์—๋„ WPF๊ฐœ๋ฐœ์— DI ์ปจํ…Œ์ด๋„ˆ๋กœ Microsoft.Extensions.DependencyInjection์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๊ณ ,
Transient๋งŒ ๊ฐ€์ง€๊ณ ๋„ ํ•„์š”ํ•œ ์ผ€์ด์Šค๋ฅผ ์ปค๋ฒ„ ํ•  ์ˆ˜ ์žˆ์–ด์„œ Scoped ์ƒ๋ช…์ฃผ๊ธฐ๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

8๊ฐœ์˜ ์ข‹์•„์š”

๋„ค ๊ทธ๋ž˜์„œ ํ•„์š”์—†๋‹ค๋Š” ์˜๋ฏธ๋กœ ์“ฐ๊ธฐ ์–ด๋ ต๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ธฐ์— ์‘์šฉ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ๋” ์ ํ•ฉํ•œ IoC Container๊ฐ€ ์žˆ๋Š”์ง€ ์—ฌ์ญค๋ณธ ๊ธ€์ž…๋‹ˆ๋‹ค.

๋ง์”€ํ•˜์‹ ๋Œ€๋กœ WPF์—์„œ๋Š” Scope์™€ Singleton์ด ๊ฐ™๊ธฐ์— ์ €๋„ Singleton๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

6๊ฐœ์˜ ์ข‹์•„์š”

๋ฐ์Šคํฌํ†ฑ ์•ฑ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋‹ท๋„ท ํ”Œ๋žซํผ ํ™•์žฅ(Microsoft.Extensions.DependencyInjection) ์™ธ์˜ IoC ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์„ ํƒํ•ด๋ณธ ์ ์ด ์—†์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Generic Host์— ์™„๋ฒฝํžˆ ํ†ตํ•ฉ๋˜๊ณ , DI๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ๋ณธ ๊ธฐ๋Šฅ ๊ตฌํ˜„์— ์ถฉ์‹คํ•ด ๋ถˆํ•„์š”ํ•œ ๋Ÿฌ๋‹ ์ปค๋ธŒ๋„ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ท๋„ท ํ”Œ๋žซํผ ํ™•์žฅ์„ ์‚ฌ์šฉํ•˜๋ฉด์„œ ์•„์‰ฌ์šธ ๋งŒํ•œ ๋ถ€๋ถ„์ด๋ผ๋ฉด ๊ธฐ๋ณธ ๊ธฐ๋Šฅ์„ ๋„˜์–ด์„  ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•  ๋•Œ์ผ ํ…๋ฐ, ๋‹ท๋„ท ํ”Œ๋žซํผ ํ™•์žฅ์€ ํ™•์žฅ์ด ์šฉ์ดํ•˜๊ฒŒ ์„ค๊ณ„๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์ฒดํ•˜์ง€ ์•Š๊ณ  ํ™•์žฅํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ ์šฉํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋Œ€ํ‘œ์ ์œผ๋กœ Scrutor๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ท๋„ท ํ”Œ๋žซํผ ํ™•์žฅ์—์„œ ์ œ๊ณตํ•˜๋Š” DI๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ ํ•œ๊ณ„๊ฐ€ ๋А๊ปด์กŒ๋‹ค๋ฉด, ์ด๋Ÿฌํ•œ ๋‹ท๋„ท ํ”Œ๋žซํผ ํ™•์žฅ์˜ ํ™•์žฅ์„ ์‚ฌ์šฉํ•ด ๋ณด๋Š” ๊ฒƒ๋„ ์ข‹์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

5๊ฐœ์˜ ์ข‹์•„์š”

์ œ ๊ฒฝ์šฐ๋Š” ํšŒ์‚ฌ ์—…๋ฌด์—์„œ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๊ฐœ๋ฐœํ•œ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค๋งŒ, ํšŒ์‚ฌ ๋ฐ–์—์„œ์˜ ๊ฐœ์ธ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” Microsoft.Extensions.DependencyInjection๋ฅผ ์ฃผ๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ญ๋ž„๊นŒ ์‹ฌํ”Œํ•ด์„œ ์ข‹์€ ๊ฒƒ ๊ฐ™์•„์š”. :sweat_smile:

๊ทธ๋ฆฌ๊ณ  ํšŒ์‚ฌ์—์„œ ์ฃผ๋กœ MDI(Multiple-Document Interface) ๊ธฐ๋ฐ˜ WPF ์‘์šฉํ”„๋กœ๊ทธ๋žจ์„ ๋งŒ๋“ค๊ธฐ ๋•Œ๋ฌธ์—, ํ•˜๋‚˜์˜ Document๋ฅผ ๊ธฐ์ค€์œผ๋กœ Scope๋ฅผ ์ƒ์„ฑํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น Document ์•ˆ์—์„œ๋งŒ ๊ณต์œ ๋˜์–ด์•ผ ํ•˜๋Š” ์„œ๋น„์Šค๋“ค์ด ์žˆ์–ด์„œ์š”โ€ฆ

๋˜ ๋‹ค๋ฅธ ์ผ€์ด์Šค๋กœ๋Š”, ์ ์ ˆํ•œ ์˜ˆ์ธ์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ SQL Server Management Studio์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ ์„ธ์…˜์„ ๊ด€๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— Scope๋ฅผ ํ™œ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋งŒ Navigation ๊ธฐ๋ฐ˜ ์‘์šฉํ”„๋กœ๊ทธ๋žจ์ผ ๋•Œ๋Š” Scope๋ฅผ ์“ธ ์ผ์ด ๋ณ„๋กœ ์—†์—ˆ๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. :grinning:

7๊ฐœ์˜ ์ข‹์•„์š”

10๋…„ ์ „์— NInejct๋ฅผ DI์šฉ๋„๋กœ๋งŒ ์“ฐ๋Š” ํ˜•ํƒœ๋กœ ์ง„ํ–‰ํ–ˆ์—ˆ์Šต๋‹ˆ๋‹ค. WPF ์˜€๊ธฐ ๋•Œ๋ฌธ์— ์„ฑ๋Šฅ์ƒ์˜ ํฐ ์ด์  ๋ฐ ๋ฌธ์ œ๋Š” ๋ณด์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
WPF์˜ ๊ฐœ๋ฐœ ํŒจํ„ด์—์„œ๋Š” ์ˆ˜๋งŽ์€ ๊ฐ์ฒด๋“ค์ด ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋™์  ํ˜ธ์ถœ๋˜๋Š” ์ƒํ™ฉ์€ ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์•„๋งˆ๋„ ์„ฑ๋Šฅ์ƒ์˜ ์ด์ ์„ ํ™•์ธํ•˜์‹œ๊ธฐ ์œ„ํ•ด์„œ๋Š” WPF๊ฐ€ ์•„๋‹Œ ์„œ๋ฒ„๋ฅ˜๋กœ ํ™•์ธ ํ•˜์…”์•ผ ํ• ๊ฒƒ์ž…๋‹ˆ๋‹ค.

4๊ฐœ์˜ ์ข‹์•„์š”

WPF์—์„œ DependencyInjection์„ ์‚ฌ์šฉํ–ˆ์„ ๋•Œ ์•„์‰ฌ์šด ๋ถ€๋ถ„์— ๋Œ€ํ•ด, ์‹œ๋‚˜๋ฆฌ์˜ค ์˜ˆ๋ฅผ ๋“ค์–ด ๋ง์”€ํ•ด์ฃผ์‹œ๋ฉด ๋„์›€๋˜๋Š” ๋‹ต๋ณ€์„ ๋ˆ„๊ตฐ๊ฐ€ ๋Œ“๊ธ€๋กœ ๋‚จ๊ธฐ์ง€ ์•Š์„๊นŒ์š”? ์ฐธ๊ณ ๋กœ .NET 8์—์„œ Key๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹๋„ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

3๊ฐœ์˜ ์ข‹์•„์š”

์ œ๊ฐ€ ์งˆ๋ฌธ๋“œ๋ ธ๋˜ ์˜๋„๋Š” ์•„์‰ฝ๋‹ค๊ธฐ๋ณด๋‹จ ๊ฑฐ์Šฌ๋ฆฐ๋‹ค๋Š” ๋งฅ๋ฝ์ด์—ˆ์Šต๋‹ˆ๋‹ค.
ํ˜„์žฌ WPF๋ฅผ ์ฃผ์—…์œผ๋กœ ์‚ผ๊ณ  ์žˆ๋Š” ์ €์—๊ฒŒ Microsoft.Extensions.DependencyInjection์€ AddScoped๋ฅผ ์“ฐ์ง€ ๋ชปํ•˜๊ธฐ์— ์—†์–ด๋„ ๋˜๋Š” ๊ธฐ๋Šฅ์ธ ๊ฒƒ์ด์ฃ .

์‚ฌ์‹ค ๋ฒ ๊ฐ€๋ณธ๋“œ๋‹˜๊ป˜์„œ ์ข‹์€ ๊ฒฝํ—˜๊ณต์œ ๋ฅผ ํ•ด์ฃผ์…จ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ž์ฃผ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” ์•„๋‹ˆ๊ณ  ์ €๋Š” ์•„์ง ์ ‘ํ•œ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ฐจ๋ผ๋ฆฌ AddScoped๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ Windows Desktop Application์˜ ํŠน์ง•์„ ์‚ด๋ฆฐ ๋ผ์ดํ”„์‚ฌ์ดํด ์˜ต์…˜์ด ์ถ”๊ฐ€๋กœ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋Š” Ioc Container๊ฐ€ ์žˆ์œผ๋ฉด ์ข‹์ง€ ์•Š์„๊นŒ ํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”๋ถˆ์–ด ๋‹ท๋„ท ํžˆ์–ด๋กœ๋ถ„๋“ค ์˜๊ฒฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

4๊ฐœ์˜ ์ข‹์•„์š”

Multi-Window๋‚˜ Multi-Page ์•ฑ์„ ํƒ€๊ฒŸํŒ…ํ•ด์„œ Scoped๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ Window๋‚˜ Page์— ํ•œ์ •๋œ ์ˆ˜๋ช… ๋ฒ”์œ„๋ฅผ ๋งŒ๋“ค ์ˆ˜๋Š” ์žˆ์„ ๊ฒƒ ๊ฐ™์€๋ฐ, ๊ทธ๋Ÿฌํ•œ ๊ฒฝ์šฐ DI ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž์ฒด์—์„œ ํ•ด๊ฒฐํ•˜๊ธฐ ๋ณด๋‹ค๋Š” UI ํ”„๋ ˆ์ž„์›Œํฌ์— ์ข…์†๋œ Window, Page ๋“ฑ์˜ ์ปจํŠธ๋กค์„ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ํ™•์žฅํ•จ์œผ๋กœ์จ ์ด๋ฃจ์–ด์งˆ ์ˆ˜๋ฐ–์— ์—†๊ณ , ๊ทธ๋Ÿฌ๋‹ค ๋ณด๋ฉด ๊ฐœ๋ฐœ ๋ฐฉํ–ฅ์„ฑ์ด ์ƒˆ๋กœ์šด IoC ์ปจํ…Œ์ด๋„ˆ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์•„๋‹Œ UI ํ”„๋ ˆ์ž„์›Œํฌ์˜ DI ํ™•์žฅํ˜• ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ–ฅํ•  ์ˆ˜๋ฐ–์— ์—†์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“œ๋„ค์š”.

3๊ฐœ์˜ ์ข‹์•„์š”