{"id":127,"date":"2022-08-14T20:59:17","date_gmt":"2022-08-14T18:59:17","guid":{"rendered":"http:\/\/tymek.24x7.pl\/?p=127"},"modified":"2022-12-27T21:30:46","modified_gmt":"2022-12-27T20:30:46","slug":"wybor-najlepszej-platformy-w-net-w-2022-roku","status":"publish","type":"post","link":"https:\/\/tymek.24x7.pl\/index.php\/2022\/08\/14\/wybor-najlepszej-platformy-w-net-w-2022-roku\/","title":{"rendered":"Wyb\u00f3r najlepszej platformy w .NET w 2022 roku"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"127\" class=\"elementor elementor-127\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-3b1b73c elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"3b1b73c\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a6c7f42\" data-id=\"a6c7f42\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3d0e7a6 elementor-widget elementor-widget-heading\" data-id=\"3d0e7a6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Wst\u0119p<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-04d6ef5 elementor-widget elementor-widget-text-editor\" data-id=\"04d6ef5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Pod koniec maja br. postawi\u0142em przed sob\u0105 pytanie, kt\u00f3re m\u0119czy\u0142o mnie od d\u0142u\u017cszego czasu oraz doszed\u0142em w swojej pracy zawodowej do takiego momentu, \u017ce musz\u0119 sprecyzowa\u0107 swoje zainteresowania i ustali\u0107 konkretniejsz\u0105 \u015bcie\u017ck\u0119 rozwoju dla siebie i dla dzia\u0142u programistycznego, kt\u00f3ry prowadz\u0119 (i kt\u00f3rego jestem jedynym cz\u0142onkiem). M\u00f3j dylemat wyboru technologii jest nast\u0119puj\u0105cy:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-71387c2 elementor-widget elementor-widget-testimonial\" data-id=\"71387c2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"testimonial.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"elementor-testimonial-wrapper\">\n\t\t\t\t\t\t\t<div class=\"elementor-testimonial-content\">Powiedzmy, \u017ce musz\u0119 stworzy\u0107 aplikacj\u0119 desktopow\u0105 w pracy, kt\u00f3ra b\u0119dzie niezawodna, dobra, szybka i b\u0119dzie dzia\u0142a\u0107 przez d\u0142ugi czas ze wsparciem. B\u0119dzie mie\u0107 g\u0142\u00f3wnie podstawowe funkcje, \u0142\u0105czenie si\u0119 z baz\u0105 danych, jakie\u015b obliczenia\/modyfikacje danych i \u0142\u0105czenie z zewn\u0119trznym API. B\u0119dzie u\u017cywana przez personel administracyjny w biurze. Ale chc\u0119, \u017ceby wygl\u0105da\u0142a r\u00f3wnocze\u015bnie ca\u0142kiem nowocze\u015bnie.\nJaki stos technologiczny w C# wybra\u0107 do takiej aplikacji? Czy mimo wszystko powinienem zrobi\u0107 to jako aplikacj\u0119 komputerow\u0105, czy jednak ju\u017c powinno si\u0119 tworzy\u0107 aplikacje internetowe? Jakie jest teraz najnowsze, ale zaufane rozwi\u0105zanie?\nWiem, \u017ce .NET MAUI to kolejna wielka rzecz, ale na razie nie wiemy, czy b\u0119dzie dzia\u0142a\u0107 tak d\u0142ugo, jak WinForms, czy umrze tak szybko, jak UWP.\nWymy\u015bli\u0142em wi\u0119c cztery mo\u017cliwo\u015bci podane ni\u017cej w ankiecie - kt\u00f3ra z nich b\u0119dzie najlepsza w moim przypadku? Czy mo\u017ce jest lepsza opcja, kt\u00f3rej nie jestem \u015bwiadomy?<\/div>\n\t\t\t\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6a3e01e elementor-widget elementor-widget-heading\" data-id=\"6a3e01e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Hipoteza<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-96a8401 elementor-widget elementor-widget-text-editor\" data-id=\"96a8401\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Czy w 2022 roku mo\u017cna definitywnie wybra\u0107 najlepsz\u0105 platform\u0119 programistyczn\u0105 dost\u0119pn\u0105 w dotnecie?\u00a0<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-cc2acbd elementor-widget elementor-widget-heading\" data-id=\"cc2acbd\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Kr\u00f3tka odpowied\u017a<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-dad4e8e elementor-widget elementor-widget-text-editor\" data-id=\"dad4e8e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Nie. Aczkolwiek na pewno mo\u017cna je podzieli\u0107 na takie, kt\u00f3rych lepiej nie u\u017cywa\u0107 i takie, kt\u00f3re lepiej u\u017cywa\u0107, w zale\u017cno\u015bci od specyfikacji projektu.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ad70c0b elementor-widget elementor-widget-heading\" data-id=\"ad70c0b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">D\u0142uga odpowied\u017a<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-b79b1a4 elementor-widget elementor-widget-text-editor\" data-id=\"b79b1a4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Stawiaj\u0105c sobie tak\u0105 zagwozdk\u0119 do rozwi\u0105zania, doszed\u0142em do wniosku, \u017ce z takich realistycznych mo\u017cliwo\u015bci mo\u017cna wybra\u0107 nast\u0119puj\u0105ce cztery opcje:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c6ce4cb elementor-icon-list--layout-traditional elementor-list-item-link-full_width elementor-widget elementor-widget-icon-list\" data-id=\"c6ce4cb\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"icon-list.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<ul class=\"elementor-icon-list-items\">\n\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-amazon\"><\/i>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">WinForms + p\u0142atna biblioteka UI (Telerik\/DevExpress)<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-blogger-b\"><\/i>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">ASP.NET Core MVC z Blazorem<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-contao\"><\/i>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">Avalonia UI + WebAPI<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t\t\t<li class=\"elementor-icon-list-item\">\n\t\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-icon\">\n\t\t\t\t\t\t\t<i aria-hidden=\"true\" class=\"fab fa-dochub\"><\/i>\t\t\t\t\t\t<\/span>\n\t\t\t\t\t\t\t\t\t\t<span class=\"elementor-icon-list-text\">WPF<\/span>\n\t\t\t\t\t\t\t\t\t<\/li>\n\t\t\t\t\t\t<\/ul>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1f61e12 elementor-widget elementor-widget-text-editor\" data-id=\"1f61e12\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>\u017beby doj\u015b\u0107 do jakiej\u015b odpowiedzi, \u017ceby m\u00f3c wyci\u0105gn\u0105\u0107 jakie\u015b wnioski, zasi\u0119gn\u0105\u0142em porady od os\u00f3b bardziej (ale mo\u017ce te\u017c mniej) do\u015bwiadczonych ode mnie na Reddicie, Facebooku i Discordzie. Przygotowa\u0142em ankiet\u0119 z platformami, kt\u00f3re wydawa\u0142y mi si\u0119 na pocz\u0105tku sensownymi opcjami, odrzuci\u0142em UWP, kt\u00f3re jest martwe, tak samo jak WebFormsy.<\/p><p>Mo\u017ce swoj\u0105 analiz\u0119 odpowiedzi zaczn\u0119 od zebrania sumarycznych wynik\u00f3w ankiet:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-2062f82 elementor-widget elementor-widget-progress\" data-id=\"2062f82\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"progress.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t<span class=\"elementor-title\" id=\"elementor-progress-bar-2062f82\">\n\t\t\t\tWPF\t\t\t<\/span>\n\t\t\n\t\t<div aria-labelledby=\"elementor-progress-bar-2062f82\" class=\"elementor-progress-wrapper\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"44\">\n\t\t\t<div class=\"elementor-progress-bar\" data-max=\"44\">\n\t\t\t\t<span class=\"elementor-progress-text\"><\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-progress-percentage\">44%<\/span>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-c4a4bbc elementor-widget elementor-widget-progress\" data-id=\"c4a4bbc\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"progress.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t<span class=\"elementor-title\" id=\"elementor-progress-bar-c4a4bbc\">\n\t\t\t\tASP.NET Core MVC z Blazorem\t\t\t<\/span>\n\t\t\n\t\t<div aria-labelledby=\"elementor-progress-bar-c4a4bbc\" class=\"elementor-progress-wrapper\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"31.8\">\n\t\t\t<div class=\"elementor-progress-bar\" data-max=\"31.8\">\n\t\t\t\t<span class=\"elementor-progress-text\"><\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-progress-percentage\">31.8%<\/span>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-314c0d1 elementor-widget elementor-widget-progress\" data-id=\"314c0d1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"progress.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t<span class=\"elementor-title\" id=\"elementor-progress-bar-314c0d1\">\n\t\t\t\tAvalonia UI + WebAPI\t\t\t<\/span>\n\t\t\n\t\t<div aria-labelledby=\"elementor-progress-bar-314c0d1\" class=\"elementor-progress-wrapper\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"11.2\">\n\t\t\t<div class=\"elementor-progress-bar\" data-max=\"11.2\">\n\t\t\t\t<span class=\"elementor-progress-text\"><\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-progress-percentage\">11.2%<\/span>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6425be1 elementor-widget elementor-widget-progress\" data-id=\"6425be1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"progress.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t<span class=\"elementor-title\" id=\"elementor-progress-bar-6425be1\">\n\t\t\t\tWinForms + p\u0142atna biblioteka UI (Telerik\/DevExpress)\t\t\t<\/span>\n\t\t\n\t\t<div aria-labelledby=\"elementor-progress-bar-6425be1\" class=\"elementor-progress-wrapper\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"10.8\">\n\t\t\t<div class=\"elementor-progress-bar\" data-max=\"10.8\">\n\t\t\t\t<span class=\"elementor-progress-text\"><\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-progress-percentage\">10.8%<\/span>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-209b6ab elementor-widget elementor-widget-progress\" data-id=\"209b6ab\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"progress.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t<span class=\"elementor-title\" id=\"elementor-progress-bar-209b6ab\">\n\t\t\t\tBlazor\t\t\t<\/span>\n\t\t\n\t\t<div aria-labelledby=\"elementor-progress-bar-209b6ab\" class=\"elementor-progress-wrapper\" role=\"progressbar\" aria-valuemin=\"0\" aria-valuemax=\"100\" aria-valuenow=\"1.2\">\n\t\t\t<div class=\"elementor-progress-bar\" data-max=\"1.2\">\n\t\t\t\t<span class=\"elementor-progress-text\"><\/span>\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-progress-percentage\">1.2%<\/span>\n\t\t\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3ad52bf elementor-widget elementor-widget-text-editor\" data-id=\"3ad52bf\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>W sumie by\u0142o 1386 g\u0142os\u00f3w, pojawi\u0142y si\u0119 te\u017c pojedyncze odpowiedzi sugeruj\u0105ce m.in. MahApps.Metro, Syncfusion, MAUI, UWP, UNO Platform, Xamarin forms i WinUI.<\/p><p>Wychodzi zatem na to, \u017ce na ten moment, WPF jest najcz\u0119stszym wyborem platformy do tworzenia aplikacji w zamy\u015ble desktopowych, ale powoli rozwi\u0105zania webowe zaczynaj\u0105 przejmowa\u0107 coraz wi\u0119kszy kawa\u0142ek zaj\u0119to\u015bci rynku. WPF daje wiele mo\u017cliwo\u015bci i mo\u017cna stworzy\u0107 interfejs wygl\u0105daj\u0105cy w dowolny spos\u00f3b. Blazor jest nowink\u0105, ale w miar\u0119 przyj\u0119t\u0105, za to MAUI to nowinka tak nowa, \u017ce nikt jeszcze nic powa\u017cnego w nim nie robi &#8211; a poza tym jest to biblioteka nastawiona najbardziej na urz\u0105dzenia mobilne, kt\u00f3ra po prostu dzia\u0142a na komputerach. Wi\u0119c w przypadku bardziej zaawansowanych aplikacji desktopowych mo\u017ce si\u0119 nie sprawdzi\u0107. A poni\u017cej opisz\u0119 ka\u017cd\u0105 z tych 5 opcji, razem z tym, co uda\u0142o mi si\u0119 o nich dowiedzie\u0107 i sugesti\u0105, do jakich projekt\u00f3w ja bym ich u\u017cywa\u0142.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f1e9188 elementor-widget elementor-widget-heading\" data-id=\"f1e9188\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Blazor<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3891e73 elementor-widget elementor-widget-text-editor\" data-id=\"3891e73\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Blazor to platforma do tworzenia interaktywnych, webowych interfejs\u00f3w. Tak w najwi\u0119kszym skr\u00f3cie, jest to aplikacja webowa, w kt\u00f3rej we frontendzie mo\u017cna, zamiast JavaScriptu, u\u017cywa\u0107 C#. Powoli nowe projekty zaczynaj\u0105 wykorzystywa\u0107 Blazora, wydajno\u015bciowo spisuje si\u0119 naprawd\u0119 dobrze, a w internecie jest coraz wi\u0119cej poradnik\u00f3w jak z niego korzysta\u0107. Mimo wszystko zaleca si\u0119 u\u017cywania Blazora tylko do interfejsu graficznego, a ca\u0142a logika biznesowa aplikacja powinna by\u0107 postawiona osobno jako API. Chocia\u017c serwer z kontrolerami te\u017c da si\u0119 w Blazorze postawi\u0107.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-1dadae3 elementor-widget elementor-widget-heading\" data-id=\"1dadae3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">WinForms + p\u0142atne biblioteki<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e97c4e elementor-widget elementor-widget-text-editor\" data-id=\"3e97c4e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>WinForms to jedna z najstarszych platform do tworzenia projekt\u00f3w w C#, kt\u00f3r\u0105 mo\u017cna ju\u017c prawie nazwa\u0107 nie\u015bmierteln\u0105. WinFormsy prze\u017cy\u0142y kilku swoich &#8222;nast\u0119pc\u00f3w&#8221;, nadal s\u0105 powszechnie wykorzystywane i nic nie zapowiada, \u017ceby mia\u0142y umrze\u0107. Prawd\u0105 jest, \u017ce ju\u017c pewnie \u017caden nowowczesny, du\u017cy projekt ju\u017c w WinFormsach nie powstanie, ale jest tak du\u017co starszych aplikacji, kt\u00f3re nadal funkcjonuj\u0105, wi\u0119c zaznajomienie si\u0119 z nimi to bardzo przydatna wiedza. Sam w sobie nie wygl\u0105da dobrze, ale istnieje du\u017co popularnych, ale p\u0142atnych bibliotek, kt\u00f3re mog\u0105 z niego zrobi\u0107 aplikacj\u0119 wygl\u0105daj\u0105ca r\u00f3wnie dobrze co nowe aplikacje Microsoftu, jak pakiet Office, czy inna desktopowa aplikacja. Jednak mimo to, ci\u0119\u017cko utrzyma\u0107 w nim bardziej skomplikowan\u0105 aplikacj\u0119 z zaawansowan\u0105 architektur\u0105.<\/p><p>Niekt\u00f3rzy kochaj\u0105 WinFormsy, niekt\u00f3rzy nienawidz\u0105, podobno innej opcji nie ma. Wyb\u00f3r jest prosty &#8211; robisz szybko co\u015b prostego na komputer, bierz WinFormsa. Robisz co\u015b, co wymaga bardziej skomplikowanych rzeczy? Trzymaj si\u0119 z daleka.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f262dd3 elementor-widget elementor-widget-heading\" data-id=\"f262dd3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Avalonia UI + WebAPI<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-6920d24 elementor-widget elementor-widget-text-editor\" data-id=\"6920d24\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Avalonia oparta jest na XAMLu, tak samo, jak WPF, Silverlight, WinUI, UWP, Xamarin, Uno, MAUI i pewnie wiele innych platform. Nie ma co si\u0119 tutaj du\u017co rozpisywa\u0107. Ka\u017cda z tych opcji polega na napisaniu interfejsu u\u017cytkownika w XAMLu i komunikowanie si\u0119 z API, \u017ceby zapewni\u0107 aplikacji jak\u0105\u015b logik\u0119 biznesow\u0105.\u00a0<\/p><p>WebAPI &#8211; cho\u0107 mimowolnie dzisiaj uniwersalnie okre\u015blenie &#8222;API&#8221; od razu kojarzy si\u0119 z API wystawionym gdzie\u015b w sieci, to formalnie samo API mo\u017ce oznacza\u0107 r\u00f3wnie\u017c dll-k\u0119 do komunikacji z innym programem lub bibliotek\u0105 na tym samym komputerze &#8211; a w sieci mamy WebAPI. Ta opcja polega na napisaniu serwera, do kt\u00f3rego wysy\u0142amy zapytania HTTP (np. wchodz\u0105c pod konkretny adres URL w przegl\u0105darce), a w odpowiedzi dostajemy dane, kt\u00f3re potrzebujemy.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-de30777 elementor-widget elementor-widget-heading\" data-id=\"de30777\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">ASP.NET Core MVC z Blazorem\u200b<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-946b1c8 elementor-widget elementor-widget-text-editor\" data-id=\"946b1c8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>By\u0107 mo\u017ce b\u0142\u0119dnie stworzy\u0142em ten punkt w ankiecie &#8211; bo ASP.NET Core MVC mo\u017ce istnie\u0107 z Blazorem, mo\u017ce istnie\u0107 bez, tak samo Blazor mo\u017ce istnie\u0107 sam. A domy\u015blnie w aplikacjach webowych ASP.NET interfejs robimy w razor-pages, czyli plikach .cshtml, gdzie opr\u00f3cz HTMLa i JSa mo\u017cna co\u015b dopisa\u0107 w C#. Jednak w odr\u00f3\u017cnieniu od Blazora, razor-pages wykorzystuj\u0105 C# tylko do wygenerowania HTMLa jeszcze po stronie serwera. A Blazor mo\u017ce wykonywa\u0107 ten kod po stronie klienta. ASP.NET mo\u017cna okre\u015bli\u0107 jako podstaw\u0119 aplikacji webowych w C#. Najpopularniejsz\u0105 architektur\u0105 jest MVC, gdzie g\u0142\u00f3wnym elementem s\u0105 kontrolery &#8211; bior\u0105 one dane z modelu i wysy\u0142aj\u0105 do widoku, kt\u00f3ry widzi u\u017cytkownik &#8211; tak w uproszczeniu.<\/p><p>Wi\u0119c ASP.NET jest podstawowym budulcem aplikacji serwerowych w C#, a dost\u0119p do tej aplikacji mo\u017ce by\u0107 przez API, przez strony zrobione jako razor-pages albo przez strony zrobione w Blazorze.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-33fd70a elementor-widget elementor-widget-heading\" data-id=\"33fd70a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">WPF<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-aa8ab28 elementor-widget elementor-widget-text-editor\" data-id=\"aa8ab28\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Windows Presentation Foundation zosta\u0142 wypuszczony w \u015bwiat w 2006 roku, 4 lata po WinFormsach. Dzisiaj mo\u017cna ju\u017c uzna\u0107, \u017ce przej\u0105\u0142 pa\u0142eczk\u0119 od WinForms\u00f3w jako podstawowa platforma do tworzenia aplikacji desktopowych w C#, cho\u0107 troch\u0119 czasu to zaj\u0119\u0142o. Architektura jest prawie identyczna z WinForms &#8211; mamy jeden plik, kt\u00f3ry tworzy interfejs, i drugi, po\u0142\u0105czony z nim, kt\u00f3ry obs\u0142uguje ten interfejs. Tam obs\u0142ugujemy wszystkie zdarzenia wywo\u0142ane przez u\u017cytkownika i obs\u0142ugujemy ca\u0142\u0105 logik\u0119 aplikacji (oczywi\u015bcie w zale\u017cno\u015bci od podej\u015bcia i skali, mo\u017ce by\u0107 to bezpo\u015brednio, mo\u017ce by\u0107 poprzez wywo\u0142ywanie zaszytej w innych plikach logiki, lub komunikowanie si\u0119 z API). Dodatkowo tak jak w WinFormsach, w WPFie r\u00f3wnie\u017c mo\u017cemy skorzysta\u0107 z bibliotek rozbudowuj\u0105cych mo\u017cliwo\u015bci interfejsu u\u017cytkownika.<\/p><p>T\u0119 opcj\u0119 sugerowa\u0142bym wybra\u0107 wszystkim, kt\u00f3rzy maj\u0105 konkretne argumenty na to, \u017ce ich aplikacja musi by\u0107 aplikacj\u0105 desktopow\u0105, a nie mo\u017ce by\u0107 webow\u0105.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3e93ff9 elementor-widget elementor-widget-heading\" data-id=\"3e93ff9\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Podsumowanie<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-ec6b665 elementor-widget elementor-widget-text-editor\" data-id=\"ec6b665\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Ilu programist\u00f3w, tyle rozwi\u0105za\u0144. Na pewno przy tworzeniu w\u0142asnej aplikacji, musisz zastanowi\u0107 si\u0119, co ona ma robi\u0107, gdzie i jak ma by\u0107 u\u017cywana, bo od tego zale\u017cy, czy powiniene\u015b zrobi\u0107 aplikacj\u0119 desktopow\u0105, czy webow\u0105.<\/p><p>Je\u017celi sk\u0142aniasz si\u0119 ku desktopowi, to wychodzi na to, \u017ce najlepiej w 2022 roku zabra\u0107 si\u0119 od razu za WPF, pomijaj\u0105c poczciwe WinFormsy (wow &#8211; jest to chyba jedyne definitywne stwierdzenie w ca\u0142ym artykule). Przy nowszych systemach, wi\u0119kszych rozdzielczo\u015bciach, WinForms po prostu przestaje ju\u017c wyrabia\u0107.<\/p><p>A je\u017celi sk\u0142aniasz si\u0119 ku aplikacjom webowym, to do wyboru, do koloru &#8211; jak chcesz r\u00f3wnie\u017c mobilk\u0119, to na pewno zr\u00f3b API, a interfejs\u00f3w kilka, jeden na telefon, drugi na komputer. Jak nie potrzebujesz obs\u0142ugi telefon\u00f3ow, to te\u017c zale\u017cy, czy chcesz siedzie\u0107 tylko w C# i wybra\u0107 ASP.NET MVC, czy masz ochot\u0119 na co\u015b innego, to opr\u00f3cz API mo\u017cesz te\u017c nauczy\u0107 si\u0119 Reacta, Angulara, czy innych tych takich JavaScript\u00f3w do frontendu.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-309a6e0 elementor-widget elementor-widget-heading\" data-id=\"309a6e0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"heading.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<h2 class=\"elementor-heading-title elementor-size-default\">Gdy kto\u015b si\u0119 postara w internecie, trzeba mu podzi\u0119kowa\u0107<\/h2>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-94e3038 elementor-widget elementor-widget-text-editor\" data-id=\"94e3038\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Poni\u017cej zamieszczam komentarz u\u017cytkownika u\/Slypenslyde, kt\u00f3ry napisa\u0142 bardzo konkretny komentarz na ten temat &#8211; warto go przeczyta\u0107.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0b204d7 elementor-widget elementor-widget-html\" data-id=\"0b204d7\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<iframe id=\"reddit-embed\" src=\"https:\/\/www.redditmedia.com\/r\/csharp\/comments\/uxj6vg\/current_best_choice_of_net_library_for_dekstop\/i9y4bwp\/?depth=1&amp;showmore=false&amp;embed=true&amp;showtitle=true&amp;showmedia=false&amp;theme=dark\" sandbox=\"allow-scripts allow-same-origin allow-popups\" style=\"border: none;\" height=\"1325\" width=\"640\" scrolling=\"no\"><\/iframe>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Wst\u0119p Pod koniec maja br. postawi\u0142em przed sob\u0105 pytanie, kt\u00f3re m\u0119czy\u0142o mnie od d\u0142u\u017cszego czasu oraz doszed\u0142em w swojej pracy zawodowej do takiego momentu, \u017ce musz\u0119 sprecyzowa\u0107 swoje zainteresowania i ustali\u0107 konkretniejsz\u0105 \u015bcie\u017ck\u0119 rozwoju dla siebie i dla dzia\u0142u programistycznego, kt\u00f3ry prowadz\u0119 (i kt\u00f3rego jestem jedynym cz\u0142onkiem). M\u00f3j dylemat wyboru technologii jest nast\u0119puj\u0105cy: Powiedzmy, \u017ce&#8230;<\/p>\n","protected":false},"author":1,"featured_media":175,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-127","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-bez-kategorii"],"_links":{"self":[{"href":"https:\/\/tymek.24x7.pl\/index.php\/wp-json\/wp\/v2\/posts\/127","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tymek.24x7.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tymek.24x7.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tymek.24x7.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tymek.24x7.pl\/index.php\/wp-json\/wp\/v2\/comments?post=127"}],"version-history":[{"count":34,"href":"https:\/\/tymek.24x7.pl\/index.php\/wp-json\/wp\/v2\/posts\/127\/revisions"}],"predecessor-version":[{"id":220,"href":"https:\/\/tymek.24x7.pl\/index.php\/wp-json\/wp\/v2\/posts\/127\/revisions\/220"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tymek.24x7.pl\/index.php\/wp-json\/wp\/v2\/media\/175"}],"wp:attachment":[{"href":"https:\/\/tymek.24x7.pl\/index.php\/wp-json\/wp\/v2\/media?parent=127"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tymek.24x7.pl\/index.php\/wp-json\/wp\/v2\/categories?post=127"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tymek.24x7.pl\/index.php\/wp-json\/wp\/v2\/tags?post=127"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}