{"id":42915,"date":"2024-11-13T22:28:13","date_gmt":"2024-11-13T22:28:13","guid":{"rendered":"https:\/\/atmokpo.com\/w\/?p=42915"},"modified":"2024-11-26T06:34:27","modified_gmt":"2024-11-26T06:34:27","slug":"mvvm-4-dependency-injection%ea%b3%bc-service-locator-%ed%8c%a8%ed%84%b4-mvvm%ec%97%90%ec%84%9c%ec%9d%98-dependency-injection-%ec%84%a4%ec%a0%95-%ec%98%88-microsoft-extensions","status":"publish","type":"post","link":"https:\/\/atmokpo.com\/w\/42915\/","title":{"rendered":"[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608  Microsoft.Extensions"},"content":{"rendered":"<p>\ud604\ub300 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc5d0\uc11c \uc758\uc874\uc131 \uc8fc\uc785(Dependency Injection, DI)\uacfc \uc11c\ube44\uc2a4 \ub85c\ucf00\uc774\ud130(Service Locator) \ud328\ud134\uc740 \uac1d\uccb4 \uac04\uc758 \uc758\uc874 \uad00\uacc4\ub97c \uad00\ub9ac\ud558\uae30 \uc704\ud574 \ub110\ub9ac \uc0ac\uc6a9\ub418\ub294 \ub450 \uac00\uc9c0 \uc8fc\uc694 \ubc29\ubc95\ub860\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud328\ud134\ub4e4\uc740 \ud2b9\ud788 MVVM(\ubaa8\ub378-\ubdf0-\ubdf0\ubaa8\ub378) \uc544\ud0a4\ud14d\ucc98\uc640 \ud568\uaed8 \uc0ac\uc6a9\ud560 \ub54c \uc7a5\uc810\uc774 \uadf9\ub300\ud654\ub429\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 C# WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c Dependency Injection\uacfc Service Locator \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc790\uc138\ud788 \uc124\uba85\ud558\uace0, Microsoft.Extensions.DependencyInjection\uc744 \ud65c\uc6a9\ud55c DI \uc124\uc815 \uc608\uc81c\ub97c \uc81c\uacf5\ud558\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>1. Dependency Injection\uc774\ub780?<\/h2>\n<p>Dependency Injection\uc740 \uac1d\uccb4\uac00 \ub2e4\ub978 \uac1d\uccb4\uc5d0 \ub300\ud55c \uc758\uc874\uc131\uc744 \ucf54\ub4dc \ub0b4\uc5d0\uc11c \uc9c1\uc811 \uc0dd\uc131\ud558\ub294 \ub300\uc2e0, \uc678\ubd80\uc5d0\uc11c \uc8fc\uc785\ubc1b\ub3c4\ub85d \uc124\uacc4\ud558\ub294 \ud328\ud134\uc785\ub2c8\ub2e4. \uc774\ub85c \uc778\ud574 \ucf54\ub4dc \uac04\uc758 \uacb0\ud569\ub3c4\uac00 \ub0ae\uc544\uc9c0\uace0, \ud14c\uc2a4\ud2b8 \uc6a9\uc774\uc131\uacfc \uc720\uc9c0\ubcf4\uc218\uc131\uc774 \ud5a5\uc0c1\ub429\ub2c8\ub2e4.<\/p>\n<p>\uc608\ub97c \ub4e4\uc5b4, A \ud074\ub798\uc2a4\uac00 B \ud074\ub798\uc2a4\uc5d0 \uc758\uc874\ud560 \ub54c, B \ud074\ub798\uc2a4\ub97c A \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790 \ub0b4\uc5d0\uc11c \uc9c1\uc811 \uc0dd\uc131\ud558\ub294 \ub300\uc2e0 B \ud074\ub798\uc2a4\uc758 \uc778\uc2a4\ud134\uc2a4\ub97c A \ud074\ub798\uc2a4\uc758 \uc0dd\uc131\uc790\uc5d0 \uc778\uc790\ub85c \uc804\ub2ec\ud558\uc5ec \uc758\uc874\uc131\uc744 \uc8fc\uc785\ud569\ub2c8\ub2e4. \uc774\ub807\uac8c \ud568\uc73c\ub85c\uc368 A \ud074\ub798\uc2a4\ub294 B \ud074\ub798\uc2a4\uc758 \uad6c\uccb4\uc801\uc778 implementation\uc5d0 \uc758\uc874\ud558\uc9c0 \uc54a\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<h2>2. Service Locator \ud328\ud134<\/h2>\n<p>Service Locator \ud328\ud134\uc740 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \uc11c\ube44\uc2a4\ub97c \uc911\uc559\uc5d0\uc11c \uad00\ub9ac\ud558\uace0, \ud544\uc694\ud560 \ub54c\ub9c8\ub2e4 \uc11c\ube44\uc2a4\ub97c \uc694\uccad\ud558\uc5ec \uc81c\uacf5\ubc1b\ub294 \ubc29\uc2dd\uc785\ub2c8\ub2e4. \uc774 \ud328\ud134\uc740 DI\uc640 \ud568\uaed8 \uc0ac\uc6a9\ub418\uae30\ub3c4 \ud558\uc9c0\ub9cc, DI\uc5d0 \ube44\ud574 \uc885\uc18d\uc131\uc744 \uba85\uc2dc\uc801\uc73c\ub85c \ub4dc\ub7ec\ub0b4\uc9c0 \uc54a\ub294\ub2e4\ub294 \ub2e8\uc810\uc774 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud2b9\uc131 \ub54c\ubb38\uc5d0 Service Locator\ub294 \ud14c\uc2a4\ud2b8\uac00 \uc5b4\ub835\uace0, \uc720\uc9c0\ubcf4\uc218\uc758 \ubcf5\uc7a1\uc131\uc744 \uc99d\uac00\uc2dc\ud0ac \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>Service Locator\uc758 \uad6c\uc870<\/h3>\n<pre><code>\npublic interface IService { \/*...*\/ }\n\npublic class ServiceLocator {\n    private static readonly Dictionary<type, iservice=\"\"> _services = new();\n\n    public static void Register<t>(T service) where T : IService {\n        _services[typeof(T)] = service;\n    }\n\n    public static T GetService<t>() where T : IService {\n        return (T)_services[typeof(T)];\n    }\n}\n<\/t><\/t><\/type,><\/code><\/pre>\n<h2>3. MVVM \uc544\ud0a4\ud14d\ucc98\uc640 Dependency Injection<\/h2>\n<p>MVVM \uc544\ud0a4\ud14d\ucc98\ub294 WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c UI\uc640 \ube44\uc988\ub2c8\uc2a4 \ub85c\uc9c1\uc744 \ubd84\ub9ac\ud558\ub294 \ub370 \ub3c4\uc6c0\uc744 \uc90d\ub2c8\ub2e4. \uc774 \uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c ViewModel\uc774 View\uc640 Model \uac04\uc758 \uc0c1\ud638\uc791\uc6a9\uc744 \uad00\ub9ac\ud558\uba70, DI\ub294 ViewModel\uc758 \uc758\uc874\uc131\uc744 \uad00\ub9ac\ud558\ub294 \ub370 \ud070 \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4.<\/p>\n<h3>MVVM\uc5d0\uc11c\uc758 DI \uc7a5\uc810<\/h3>\n<ul>\n<li><strong>\ud14c\uc2a4\ud2b8 \uc6a9\uc774\uc131:<\/strong> \uc678\ubd80 \uc758\uc874\uc131\uc744 \uc27d\uac8c Mocking\ud560 \uc218 \uc788\uc5b4 \ub2e8\uc704 \ud14c\uc2a4\ud2b8\ub97c \uc2e4\uc2dc\ud558\uae30 \uc6a9\uc774\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>\uc720\uc5f0\uc131:<\/strong> \uad6c\ud604\uccb4\ub97c \uc27d\uac8c \ubcc0\uacbd\ud560 \uc218 \uc788\uc5b4 \ucf54\ub4dc\uc758 \uc720\uc9c0\ubcf4\uc218\uac00 \uc6a9\uc774\ud569\ub2c8\ub2e4.<\/li>\n<li><strong>\uba85\uc2dc\uc801 \uc758\uc874\uc131:<\/strong> \uc0dd\uc131\uc790\uc5d0\uc11c \uc758\uc874\uc131\uc744 \uba85\uc2dc\uc801\uc73c\ub85c \ub098\ud0c0\ub098\uac8c \ud568\uc73c\ub85c\uc368, \uc5b4\ub5a4 \uc758\uc874\uc131\uc774 \ud544\uc694\ud55c\uc9c0 \uba85\ud655\ud788 \uc54c \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<h2>4. Microsoft.Extensions.DependencyInjection\uc744 \ud1b5\ud55c DI \uc124\uc815<\/h2>\n<p>Microsoft.Extensions.DependencyInjection\uc740 .NET Core \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c DI\ub97c \uad6c\ud604\ud558\uae30 \uc704\ud55c \uacbd\ub7c9 \ub77c\uc774\ube0c\ub7ec\ub9ac\uc785\ub2c8\ub2e4. WPF \ub0b4\uc5d0\uc11c\ub3c4 \uc774 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \ud65c\uc6a9\ud558\uc5ec Dependency Injection\uc744 \uc27d\uac8c \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h3>4.1. \ud328\ud0a4\uc9c0 \uc124\uce58<\/h3>\n<p>Visual Studio\uc758 NuGet \ud328\ud0a4\uc9c0 \uad00\ub9ac\uc790\uc5d0\uc11c <code>Microsoft.Extensions.DependencyInjection<\/code> \ud328\ud0a4\uc9c0\ub97c \uc124\uce58\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>\nPM&gt; Install-Package Microsoft.Extensions.DependencyInjection\n<\/code><\/pre>\n<h3>4.2. \uc11c\ube44\uc2a4 \ub4f1\ub85d<\/h3>\n<p>\uc11c\ube44\uc2a4\ub97c \ub4f1\ub85d\ud558\uae30 \uc704\ud574, <code>ServiceCollection<\/code>\uc744 \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc774\uacf3\uc5d0 \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c \ud544\uc694\ud55c \ubaa8\ub4e0 \uc11c\ube44\uc2a4\ub97c \ub4f1\ub85d\ud558\uac8c \ub429\ub2c8\ub2e4.<\/p>\n<pre><code>\nusing Microsoft.Extensions.DependencyInjection;\n\npublic class App : Application {\n    private readonly IServiceProvider _serviceProvider;\n\n    public App() {\n        var serviceCollection = new ServiceCollection();\n        ConfigureServices(serviceCollection);\n        _serviceProvider = serviceCollection.BuildServiceProvider();\n    }\n\n    private void ConfigureServices(IServiceCollection services) {\n        services.AddTransient<imyservice, myservice=\"\">();\n        services.AddSingleton<mainviewmodel>();\n    }\n}\n<\/mainviewmodel><\/imyservice,><\/code><\/pre>\n<h3>4.3. ViewModel \uc8fc\uc785<\/h3>\n<p>ViewModel\uc5d0 DI\ub97c \uc801\uc6a9\ud558\uae30 \uc704\ud574 XAML\uc5d0\uc11c ViewModel\uc744 \uc124\uc815\ud558\ub294 \ubc29\ubc95\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c XAML\uc5d0\uc11c\ub294 ViewModel\uc744 \uc778\uc2a4\ud134\uc2a4\ud654\ud558\ub294 \uac83\uc774 \ubd88\uac00\ub2a5\ud558\ubbc0\ub85c, ViewModelLocator\ub97c \uc0ac\uc6a9\ud558\uc5ec ViewModel\uc744 \uac00\uc838\uc635\ub2c8\ub2e4.<\/p>\n<pre><code>\npublic class ViewModelLocator {\n    public MainViewModel MainViewModel =&gt; App.ServiceProvider.GetService<mainviewmodel>();\n}\n<\/mainviewmodel><\/code><\/pre>\n<h3>4.4. XAML\uc5d0\uc11c ViewModel \ubc14\uc778\ub529<\/h3>\n<p>XAML\uc5d0\uc11c ViewModel \uc561\uc138\uc2a4\ub97c \uc81c\uacf5\ud558\uae30 \uc704\ud574, ViewModelLocator\ub97c \ub9ac\uc18c\uc2a4\ub85c \ucd94\uac00\ud558\uace0, \ub370\uc774\ud130 \ubc14\uc778\ub529\uc744 \uc124\uc815\ud569\ub2c8\ub2e4.<\/p>\n<pre><code>\n<window height=\"350\" title=\"MainWindow\" width=\"525\" x:class=\"WpfApp.MainWindow\" xmlns=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\/presentation\" xmlns:local=\"clr-namespace:WpfApp\" xmlns:x=\"http:\/\/schemas.microsoft.com\/winfx\/2006\/xaml\">\n    <window.resources>\n        <local:viewmodellocator x:key=\"Locator\"><\/local:viewmodellocator>\n    <\/window.resources>\n    <grid datacontext=\"{Binding MainViewModel, Source={StaticResource Locator}}\">\n        <!-- UI elements binding to MainViewModel properties -->\n    <\/grid>\n<\/window>\n<\/code><\/pre>\n<h2>5. Dependency Injection\uacfc Service Locator\uc758 \ube44\uad50<\/h2>\n<p>DI\uc640 Service Locator\ub294 \uac01\uac01 \uc7a5\ub2e8\uc810\uc774 \uc788\uc73c\uba70, \ud2b9\uc815 \uc0c1\ud669\uc5d0\uc11c \uc5b4\ub5a4 \ubc29\ubc95\ub860\uc774 \ub354 \uc801\ud569\ud560\uc9c0 \ud310\ub2e8\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<ul>\n<li><strong>Dependency Injection:<\/strong>\n<ul>\n<li>\uc7a5\uc810: \ud14c\uc2a4\ud2b8 \uc6a9\uc774\uc131, \uacb0\ud569\ub3c4 \uac10\uc18c, \uba85\ud655\ud55c \uc758\uc874\uc131 \uad00\ub9ac<\/li>\n<li>\ub2e8\uc810: \ucd08\uae30 \uc124\uc815\uc774 \ub2e4\uc18c \ubcf5\uc7a1\ud560 \uc218 \uc788\uc74c<\/li>\n<\/ul>\n<\/li>\n<li><strong>Service Locator:<\/strong>\n<ul>\n<li>\uc7a5\uc810: \uac04\ub2e8\ud55c \uc124\uc815, \ucf54\ub4dc\uc758 \ub2e8\uc21c\uc131<\/li>\n<li>\ub2e8\uc810: \ud14c\uc2a4\ud2b8\uac00 \uc5b4\ub824\uc6cc\uc9c0\uace0, \uc758\uc874\uc131\uc774 \ucf54\ub4dc\uc5d0 \uba85\uc2dc\ub418\uc9c0 \uc54a\uc74c<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h2>6. \uacb0\ub860<\/h2>\n<p>Dependency Injection\uacfc Service Locator \ud328\ud134\uc740 WPF MVVM \uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c \uac1d\uccb4 \uac04\uc758 \uc758\uc874\uc131\uc744 \uad00\ub9ac\ud558\ub294 \ub370 \uc911\uc694\ud55c \uc5ed\ud560\uc744 \ud569\ub2c8\ub2e4. \uc774 \ub450 \ud328\ud134 \ubaa8\ub450 \uc7a5\ub2e8\uc810\uc774 \uc788\uc73c\ubbc0\ub85c, \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc694\uad6c \uc0ac\ud56d\uc5d0 \ub530\ub77c \uc801\uc808\ud55c \ubc29\ubc95\uc744 \uc120\ud0dd\ud574\uc57c \ud569\ub2c8\ub2e4. Microsoft.Extensions.DependencyInjection\uc744 \ud1b5\ud574 \uc758\uc874\uc131\uc744 \ud6a8\uacfc\uc801\uc73c\ub85c \uad00\ub9ac\ud568\uc73c\ub85c\uc368, \ub354 \uc720\uc9c0 \ubcf4\uc218 \uac00\ub2a5\ud558\uace0 \ud14c\uc2a4\ud2b8 \uac00\ub2a5\ud55c \ucf54\ub4dc\ub97c \uc791\uc131\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>MVVM \ud328\ud134\uc758 \ub3c4\uc785\uc740 \uad6c\uc131 \uc694\uc18c \uac04\uc758 \uba85\ud655\ud55c \ubd84\ub9ac\ub97c \uac00\ub2a5\ud558\uac8c \ud558\uace0, DI \ud328\ud134\uc744 \ud65c\uc6a9\ud568\uc73c\ub85c\uc368 \uac01 \uad6c\uc131 \uc694\uc18c\uc758 \uacb0\ud569\ub3c4\ub97c \ub0ae\ucd94\uc5b4 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc744 \ubcf4\ub2e4 \ud6a8\uc728\uc801\uc774\uace0 \uc0dd\uc0b0\uc801\uc73c\ub85c \ub9cc\ub4e4\uc5b4 \uc90d\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ubc29\uc2dd\uc744 \ud1b5\ud574 \uace0\uae09 \uac1c\ubc1c\uc790\ub85c \uc131\uc7a5\ud560 \uc218 \uc788\ub294 \uae30\ud68c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\ud604\ub300 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc5d0\uc11c \uc758\uc874\uc131 \uc8fc\uc785(Dependency Injection, DI)\uacfc \uc11c\ube44\uc2a4 \ub85c\ucf00\uc774\ud130(Service Locator) \ud328\ud134\uc740 \uac1d\uccb4 \uac04\uc758 \uc758\uc874 \uad00\uacc4\ub97c \uad00\ub9ac\ud558\uae30 \uc704\ud574 \ub110\ub9ac \uc0ac\uc6a9\ub418\ub294 \ub450 \uac00\uc9c0 \uc8fc\uc694 \ubc29\ubc95\ub860\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud328\ud134\ub4e4\uc740 \ud2b9\ud788 MVVM(\ubaa8\ub378-\ubdf0-\ubdf0\ubaa8\ub378) \uc544\ud0a4\ud14d\ucc98\uc640 \ud568\uaed8 \uc0ac\uc6a9\ud560 \ub54c \uc7a5\uc810\uc774 \uadf9\ub300\ud654\ub429\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 C# WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c Dependency Injection\uacfc Service Locator \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc790\uc138\ud788 \uc124\uba85\ud558\uace0, Microsoft.Extensions.DependencyInjection\uc744 \ud65c\uc6a9\ud55c DI \uc124\uc815 \uc608\uc81c\ub97c \uc81c\uacf5\ud558\uaca0\uc2b5\ub2c8\ub2e4. 1. Dependency &hellip; <a href=\"https:\/\/atmokpo.com\/w\/42915\/\" class=\"more-link\">\ub354 \ubcf4\uae30<span class=\"screen-reader-text\"> &#8220;[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608  Microsoft.Extensions&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[39],"tags":[],"class_list":["post-42915","post","type-post","status-publish","format-standard","hentry","category-wpf-"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v26.2 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/atmokpo.com\/w\/42915\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"og:description\" content=\"\ud604\ub300 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc5d0\uc11c \uc758\uc874\uc131 \uc8fc\uc785(Dependency Injection, DI)\uacfc \uc11c\ube44\uc2a4 \ub85c\ucf00\uc774\ud130(Service Locator) \ud328\ud134\uc740 \uac1d\uccb4 \uac04\uc758 \uc758\uc874 \uad00\uacc4\ub97c \uad00\ub9ac\ud558\uae30 \uc704\ud574 \ub110\ub9ac \uc0ac\uc6a9\ub418\ub294 \ub450 \uac00\uc9c0 \uc8fc\uc694 \ubc29\ubc95\ub860\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud328\ud134\ub4e4\uc740 \ud2b9\ud788 MVVM(\ubaa8\ub378-\ubdf0-\ubdf0\ubaa8\ub378) \uc544\ud0a4\ud14d\ucc98\uc640 \ud568\uaed8 \uc0ac\uc6a9\ud560 \ub54c \uc7a5\uc810\uc774 \uadf9\ub300\ud654\ub429\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 C# WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c Dependency Injection\uacfc Service Locator \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc790\uc138\ud788 \uc124\uba85\ud558\uace0, Microsoft.Extensions.DependencyInjection\uc744 \ud65c\uc6a9\ud55c DI \uc124\uc815 \uc608\uc81c\ub97c \uc81c\uacf5\ud558\uaca0\uc2b5\ub2c8\ub2e4. 1. Dependency &hellip; \ub354 \ubcf4\uae30 &quot;[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions&quot;\" \/>\n<meta property=\"og:url\" content=\"https:\/\/atmokpo.com\/w\/42915\/\" \/>\n<meta property=\"og:site_name\" content=\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\" \/>\n<meta property=\"article:published_time\" content=\"2024-11-13T22:28:13+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-11-26T06:34:27+00:00\" \/>\n<meta name=\"author\" content=\"root\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:site\" content=\"@bebubo4\" \/>\n<meta name=\"twitter:label1\" content=\"\uae00\uc4f4\uc774\" \/>\n\t<meta name=\"twitter:data1\" content=\"root\" \/>\n\t<meta name=\"twitter:label2\" content=\"\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04\" \/>\n\t<meta name=\"twitter:data2\" content=\"1\ubd84\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/atmokpo.com\/w\/42915\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42915\/\"},\"author\":{\"name\":\"root\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\"},\"headline\":\"[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions\",\"datePublished\":\"2024-11-13T22:28:13+00:00\",\"dateModified\":\"2024-11-26T06:34:27+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42915\/\"},\"wordCount\":117,\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"articleSection\":[\"WPF \uac1c\ubc1c\"],\"inLanguage\":\"ko-KR\"},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/atmokpo.com\/w\/42915\/\",\"url\":\"https:\/\/atmokpo.com\/w\/42915\/\",\"name\":\"[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"isPartOf\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#website\"},\"datePublished\":\"2024-11-13T22:28:13+00:00\",\"dateModified\":\"2024-11-26T06:34:27+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/atmokpo.com\/w\/42915\/#breadcrumb\"},\"inLanguage\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/atmokpo.com\/w\/42915\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/atmokpo.com\/w\/42915\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\ud648\",\"item\":\"https:\/\/atmokpo.com\/w\/en\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/atmokpo.com\/w\/#website\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/atmokpo.com\/w\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/atmokpo.com\/w\/#organization\",\"name\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\",\"url\":\"https:\/\/atmokpo.com\/w\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"contentUrl\":\"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png\",\"width\":400,\"height\":400,\"caption\":\"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8\"},\"image\":{\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/x.com\/bebubo4\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7\",\"name\":\"root\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@id\":\"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g\",\"caption\":\"root\"},\"sameAs\":[\"http:\/\/atmokpo.com\/w\"],\"url\":\"https:\/\/atmokpo.com\/w\/author\/root\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/atmokpo.com\/w\/42915\/","og_locale":"ko_KR","og_type":"article","og_title":"[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","og_description":"\ud604\ub300 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uac1c\ubc1c\uc5d0\uc11c \uc758\uc874\uc131 \uc8fc\uc785(Dependency Injection, DI)\uacfc \uc11c\ube44\uc2a4 \ub85c\ucf00\uc774\ud130(Service Locator) \ud328\ud134\uc740 \uac1d\uccb4 \uac04\uc758 \uc758\uc874 \uad00\uacc4\ub97c \uad00\ub9ac\ud558\uae30 \uc704\ud574 \ub110\ub9ac \uc0ac\uc6a9\ub418\ub294 \ub450 \uac00\uc9c0 \uc8fc\uc694 \ubc29\ubc95\ub860\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c \ud328\ud134\ub4e4\uc740 \ud2b9\ud788 MVVM(\ubaa8\ub378-\ubdf0-\ubdf0\ubaa8\ub378) \uc544\ud0a4\ud14d\ucc98\uc640 \ud568\uaed8 \uc0ac\uc6a9\ud560 \ub54c \uc7a5\uc810\uc774 \uadf9\ub300\ud654\ub429\ub2c8\ub2e4. \uc774 \uae00\uc5d0\uc11c\ub294 C# WPF \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc5d0\uc11c Dependency Injection\uacfc Service Locator \ud328\ud134\uc744 \uc0ac\uc6a9\ud558\ub294 \ubc29\ubc95\uc744 \uc790\uc138\ud788 \uc124\uba85\ud558\uace0, Microsoft.Extensions.DependencyInjection\uc744 \ud65c\uc6a9\ud55c DI \uc124\uc815 \uc608\uc81c\ub97c \uc81c\uacf5\ud558\uaca0\uc2b5\ub2c8\ub2e4. 1. Dependency &hellip; \ub354 \ubcf4\uae30 \"[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions\"","og_url":"https:\/\/atmokpo.com\/w\/42915\/","og_site_name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","article_published_time":"2024-11-13T22:28:13+00:00","article_modified_time":"2024-11-26T06:34:27+00:00","author":"root","twitter_card":"summary_large_image","twitter_creator":"@bebubo4","twitter_site":"@bebubo4","twitter_misc":{"\uae00\uc4f4\uc774":"root","\uc608\uc0c1 \ub418\ub294 \ud310\ub3c5 \uc2dc\uac04":"1\ubd84"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/atmokpo.com\/w\/42915\/#article","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/42915\/"},"author":{"name":"root","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7"},"headline":"[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions","datePublished":"2024-11-13T22:28:13+00:00","dateModified":"2024-11-26T06:34:27+00:00","mainEntityOfPage":{"@id":"https:\/\/atmokpo.com\/w\/42915\/"},"wordCount":117,"publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"articleSection":["WPF \uac1c\ubc1c"],"inLanguage":"ko-KR"},{"@type":"WebPage","@id":"https:\/\/atmokpo.com\/w\/42915\/","url":"https:\/\/atmokpo.com\/w\/42915\/","name":"[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions - \ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","isPartOf":{"@id":"https:\/\/atmokpo.com\/w\/#website"},"datePublished":"2024-11-13T22:28:13+00:00","dateModified":"2024-11-26T06:34:27+00:00","breadcrumb":{"@id":"https:\/\/atmokpo.com\/w\/42915\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/atmokpo.com\/w\/42915\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/atmokpo.com\/w\/42915\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\ud648","item":"https:\/\/atmokpo.com\/w\/en\/"},{"@type":"ListItem","position":2,"name":"[MVVM] 4.Dependency Injection\uacfc Service Locator \ud328\ud134, MVVM\uc5d0\uc11c\uc758 Dependency Injection \uc124\uc815 (\uc608 Microsoft.Extensions"}]},{"@type":"WebSite","@id":"https:\/\/atmokpo.com\/w\/#website","url":"https:\/\/atmokpo.com\/w\/","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","description":"","publisher":{"@id":"https:\/\/atmokpo.com\/w\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/atmokpo.com\/w\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"ko-KR"},{"@type":"Organization","@id":"https:\/\/atmokpo.com\/w\/#organization","name":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8","url":"https:\/\/atmokpo.com\/w\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/","url":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","contentUrl":"https:\/\/atmokpo.com\/w\/wp-content\/uploads\/2024\/11\/logo.png","width":400,"height":400,"caption":"\ub77c\uc774\ube0c\uc2a4\ub9c8\ud2b8"},"image":{"@id":"https:\/\/atmokpo.com\/w\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/x.com\/bebubo4"]},{"@type":"Person","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/91b6b3b138fbba0efb4ae64b1abd81d7","name":"root","image":{"@type":"ImageObject","inLanguage":"ko-KR","@id":"https:\/\/atmokpo.com\/w\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/708197b41fc6435a7ce22d951b25d4a47e9e904270cb1f04682d4f025066f80c?s=96&d=mm&r=g","caption":"root"},"sameAs":["http:\/\/atmokpo.com\/w"],"url":"https:\/\/atmokpo.com\/w\/author\/root\/"}]}},"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack-related-posts":[],"_links":{"self":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/42915","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/comments?post=42915"}],"version-history":[{"count":1,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/42915\/revisions"}],"predecessor-version":[{"id":42916,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/posts\/42915\/revisions\/42916"}],"wp:attachment":[{"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/media?parent=42915"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/categories?post=42915"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/atmokpo.com\/w\/wp-json\/wp\/v2\/tags?post=42915"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}