๐Ÿš€ LazyVoom.Hosting & LazyVoom.Hosting Template ๋งŒ๋“ค์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๊ฒŒ์œผ๋ฅธ ๊ฐœ๋ฐœ์ž๋“ค์„ ์œ„ํ•œ ์‹œ๋ฆฌ์ฆˆ 1ํƒ„ LazyVoom ์— ์ด์–ด 2ํƒ„์œผ๋กœ LazyVoom.Hosting์„ ๋งŒ๋“ค์–ด๋ณด์•˜์Šต๋‹ˆ๋‹ค.

๋ง ๊ทธ๋Œ€๋กœ Host ๊ธฐ๋ฐ˜์œผ๋กœ ์•ฑ์„ ์‹คํ–‰ํ•˜๊ณ  ๊ด€๋ฆฌํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ๋Š” WPF์™€ WinForms๋ฅผ ๋จผ์ € ์ง€์›ํ•˜๋ฉฐ, ํ–ฅํ›„ Avalonia, Uno, MAUI, OpenSilver ๋“ฑ์—์„œ๋„ ๋น„์Šทํ•œ ๋ฐฉ์‹์œผ๋กœ ํ™•์žฅํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.
๊ธฐ์กด์— WPF์—์„œ ํ”ํžˆ ์“ฐ๋˜ App๊ณผ MainWindow๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜, Host ๊ธฐ๋ฐ˜์œผ๋กœ ๊น”๋”ํ•˜๊ฒŒ ์•ฑ์„ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


Program์„ ๊ตณ์ด ์ž‘์„ฑํ•ด์„œ ์•ฑ์„ ์‹œ์ž‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด

์•„๋ž˜ ์ฒซ ๋ฒˆ์งธ ๋ฐฉ์‹์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด๋ฐฉ์‹

// ๊ธฐ์กด Program.cs
internal class Program
{
   [STAThread]
    private static void Main(string[] args)
    {
        App app = new();
        app.Run();
    }
}

LazyVoom.Hosting ์ ์šฉ

var builder = Host.CreateApplicationBuilder();

var app = builder.BuildApp();  // ๐Ÿ”ฅ

app.OnStartUpAsync = async provider =>
{
    // ์—ฌ๊ธฐ์„œ DI ์„œ๋น„์Šค ๊ฐ€์ ธ์™€ ์ดˆ๊ธฐํ™” ๊ฐ€๋Šฅ
};

app.Run();

LazyVoom.Hosting์˜ ํŠน์ง•

  1. Host ๊ธฐ๋ฐ˜ DI ์ง€์›
    ๊ธฐ์กด HostBuilder์™€ ๋™์ผํ•˜๊ฒŒ DI๋ฅผ ๋“ฑ๋กํ•˜๊ณ , ์•ฑ ์‹œ์ž‘ ์‹œ ๋ชจ๋“  ์„œ๋น„์Šค์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ๊ฒŒ์œผ๋ฅธ ๊ฐœ๋ฐœ์ž๋ผ๋„ DI๋ฅผ ๊น”๋”ํ•˜๊ฒŒ ์“ฐ๋Š” ์Šต๊ด€์„ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. Async Startup ์ง€์›
    ์•ฑ ์‹œ์ž‘ ์‹œ ํ•„์š”ํ•œ ์ดˆ๊ธฐํ™” ์ž‘์—…์„ async๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    WPF/WinForms์—์„œ ํ”ํžˆ ๊ฒช๋Š” UI ์Šค๋ ˆ๋“œ์™€ ๋น„๋™๊ธฐ ์ดˆ๊ธฐํ™” ๋ฌธ์ œ๋ฅผ ํ•œ ๋ฒˆ์— ํ•ด๊ฒฐํ•ฉ๋‹ˆ๋‹ค.

  3. ๋ฉ€ํ‹ฐ UI ํ”Œ๋žซํผ ํ™•์žฅ ๊ฐ€๋Šฅ
    ํ˜„์žฌ๋Š” WPF์™€ WinForms๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ, ํ–ฅํ›„ Avalonia, Uno, MAUI, OpenSilver ๋“ฑ ๋‹ค์–‘ํ•œ UI ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ํ™•์žฅ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    Host ๊ธฐ๋ฐ˜์œผ๋กœ ๊ณตํ†ต ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ ์ง€ํ•˜๋ฉด์„œ ํ”Œ๋žซํผ๋ณ„ ์•ฑ ์‹คํ–‰์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  4. ๋ณด์ผ๋Ÿฌํ”Œ๋ ˆ์ดํŠธ ์ตœ์†Œํ™”
    App.xaml.cs๋‚˜ Program.cs์— ๋ฐ˜๋ณต๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ค„์ด๊ณ , ํ•ต์‹ฌ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์— ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


์˜ˆ์‹œ: DI์™€ ์ดˆ๊ธฐํ™” ํ•จ๊ป˜ ์‚ฌ์šฉ

var builder = Host.CreateApplicationBuilder();
builder.Services.AddSingleton<IMyService, MyService>();

var app = builder.BuildApp();

app.OnStartUpAsync = async provider =>
{
    var service = provider.GetRequiredService<IMyService>();
    await service.InitializeAsync();
};

app.Run();

์ด์ œ ์•ฑ ์‹คํ–‰๊ณผ DI ์ดˆ๊ธฐํ™”๋ฅผ ํ•œ ๊ณณ์—์„œ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, UI ํ”„๋ ˆ์ž„์›Œํฌ๊ฐ€ ๋‹ฌ๋ผ๋„ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋งˆ๋ฌด๋ฆฌ

LazyVoom.Hosting์€ ๊ฒŒ์œผ๋ฅธ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•ด ๋งŒ๋“ค์–ด์กŒ์Šต๋‹ˆ๋‹ค.
Host ๊ธฐ๋ฐ˜์œผ๋กœ ์•ฑ ์‹คํ–‰๊ณผ DI ์ดˆ๊ธฐํ™”๋ฅผ ํ†ตํ•ฉํ•˜์—ฌ, ๋ณต์žกํ•œ ์•ฑ๋„ ์ตœ์†Œํ•œ์˜ ์ฝ”๋“œ๋กœ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค.

LazyVoom.Hostring ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๊ฐ€๊ธฐ

5 Likes

LazyVoom.Hosting โ€“ WPF์™€ DI ์—ฐ๋™

LazyVoom.Hosting์„ ์‚ฌ์šฉํ•˜๋ฉด, WPF ์•ฑ์—์„œ ViewModel๊ณผ DI ์ปจํ…Œ์ด๋„ˆ ์—ฐ๊ฒฐ์„ ์•„์ฃผ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธฐ์กด ๋ฐฉ์‹

public partial class App : Application
{
    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup (e);
        var services = new ServiceCollection ();

        IServiceProvider provider = services.BuildServiceProvider ();

        Voom.Instance
            .WithContainerResolver ((vmType) =>
            {
                return provider.GetService (vmType) ?? Activator.CreateInstance (vmType);
             })
            .RegisterMapping<MainWindow, MainWindowStore> ();
    }
}
  • ์„œ๋น„์Šค ํ”„๋กœ๋ฐ”์ด๋”๋ฅผ ์ง์ ‘ ๋งŒ๋“ค๊ณ 

  • ViewModel์ด ํ•„์š”ํ•  ๋•Œ DI ์ปจํ…Œ์ด๋„ˆ ๋˜๋Š” ActivatorUtilities๋ฅผ ํ†ตํ•ด ์ƒ์„ฑ

LazyVoom.Hosting ๋ฐฉ์‹

var builder = Host.CreateApplicationBuilder();
builder.Services.AddSingleton<MainWindowViewModel>();

// var app = builder.BuildApp(); // AOT ์ด์Šˆ๋กœ ํ•ด๋‹น ๋ฉ”์„œ๋“œ๋Š” ์‚ญ์ œ โŒ
var app = builder.BuildApp<App, MainWindow>(); 
app.OnStartUpAsync = async provider =>
{
    Voom.Instance.WithContainerResolver(vmType =>
    {
        return provider.GetService(vmType) ??
               ActivatorUtilities.CreateInstance(provider, vmType);
    });
};

app.Run();

  • HostApplicationBuilder ๊ธฐ๋ฐ˜์œผ๋กœ WPF ์•ฑ๊ณผ DI ์ดˆ๊ธฐํ™”๋ฅผ ๋™์‹œ์— ์ˆ˜ํ–‰

  • ์•ฑ ์‹œ์ž‘ ์‹œ ํ•„์š”ํ•œ ์ดˆ๊ธฐ ํ–‰์œ„๋„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ

  • LazyVoom์˜ Voom.Instance์™€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ†ตํ•ฉ

:white_check_mark: ํ•ต์‹ฌ:

  • DI ์ปจํ…Œ์ด๋„ˆ์™€ LazyVoom์˜ ViewModel ์—ฐ๊ฒฐ์„ ์‰ฝ๊ฒŒ ๊ตฌ์„ฑ

  • ๊ธฐ์กด WPF ๋ฐฉ์‹๋ณด๋‹ค ๋” ๊น”๋”ํ•˜๊ณ  ํ˜„๋Œ€์ ์ธ ํ˜ธ์ŠคํŠธ ๊ธฐ๋ฐ˜ ํŒจํ„ด ์ง€์›

5 Likes

net9.0์˜ FluentTheme๋ฅผ ์ ์šฉํ•ด์„œ ๋ณด๋‹ˆ

  • ๋””์ž์ธ ํƒ€์ž„์—์„  ์ •์ƒ ํ‘œ์‹œ
  • ๋Ÿฐํƒ€์ž„ ์ƒํ™ฉ์—์„  ํ…Œ๋งˆ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์Œ

์œ„์™€ ๊ฐ™์€ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜์˜€์Šต๋‹ˆ๋‹ค.

HostBuilder + DI ๊ตฌ์กฐ์—์„œ๋Š” WPF์˜ Application.Current๊ฐ€ ์ž๋™์œผ๋กœ ์„ธํŒ…๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ App.xaml์— ๋“ฑ๋ก๋œ ๋ฆฌ์†Œ์Šค๋“ค์€ Application.Current๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋ณ‘ํ•ฉ๋˜๋Š”๋ฐ, ๋Ÿฐํƒ€์ž„์—์„œ Current๊ฐ€ null์ด๊ธฐ ๋•Œ๋ฌธ์— ํ…Œ๋งˆ๊ฐ€ ์ ์šฉ๋˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ฒฐ๋ก ์ ์œผ๋กœ, ๋Ÿฐํƒ€์ž„์—์„œ ํ…Œ๋งˆ๊ฐ€ ์ •์ƒ ์ ์šฉ๋˜๋„๋ก App ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ•์ œ๋กœ Application.Current์— ์„ธํŒ…ํ•˜๊ณ , App.xaml์„ ์ˆ˜๋™์œผ๋กœ LoadComponent ํ•ด์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ HostBuilder + DI ๊ตฌ์กฐ์—์„œ๋„ ๊ธฐ์กด WPF ํ™˜๊ฒฝ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋ฆฌ์†Œ์Šค์™€ ํ…Œ๋งˆ๊ฐ€ ์ œ๋Œ€๋กœ ์ ์šฉ๋ฉ๋‹ˆ๋‹ค.

4 Likes