{"id":2124,"date":"2016-04-13T11:02:16","date_gmt":"2016-04-13T09:02:16","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=2124"},"modified":"2023-08-14T16:24:43","modified_gmt":"2023-08-14T14:24:43","slug":"mvc-vnext-co-nowego","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/mvc-vnext-co-nowego\/","title":{"rendered":"MVC vNext &#8211; co nowego?"},"content":{"rendered":"\n<p>Czym jest ASP.NET? My\u015bl\u0119, \u017ce nikomu nie trzeba t\u0142umaczy\u0107. Po niespe\u0142na 15 latach od ukazania si\u0119 pierwszej wersji ASP.NET 1.0 w wersji preview, wielkimi krokami zaczyna zbli\u017ca\u0107 si\u0119 nowe wydanie\u00a0\u2013\u00a0ASP.NET 5. Najnowsza wersja popularnego framework\u2019a do tworzenia aplikacji internetowych ma by\u0107 przede wszystkim szczuplejsza, mniej z\u0142o\u017cona, mi\u0119dzyplatformowa oraz zoptymalizowana pod k\u0105tem chmury.<\/p>\n\n\n\n<p>ASP.NET 5 jest nowoczesnym, open source\u2019owym frameworkiem, pozwalaj\u0105cym na budowanie, a&nbsp;tak\u017ce uruchamianie nowoczesnych aplikacji internetowych na platformach Windows, Linux oraz Mac. W jego sk\u0142ad wchodzi MVC 6, kt\u00f3re skupia w sobie cechy zar\u00f3wno samego MVC jak i Web API.<\/p>\n\n\n\n<p>Tak jak wspomnia\u0142em na pocz\u0105tku artyku\u0142u, w ASP.NET 5 zosta\u0142o wprowadzonych szereg zmian maj\u0105cych na celu uszczuplenie samego framework\u2019a. Oznacza to, \u017ce do dzia\u0142ania nie jest ju\u017c wymagane u\u017cywanie <em>System.Web.dll<\/em>. Kolejn\u0105 du\u017c\u0105 zmian\u0105 jest wi\u0119ksza modu\u0142owo\u015b\u0107, ma to na celu przede wszystkim pozwolenie programi\u015bcie na wi\u0119ksze zoptymalizowanie tworzonej aplikacji tak, aby wykorzystywa\u0142a tylko te modu\u0142y, kt\u00f3rych rzeczywi\u015bcie potrzebuje (ma w tym pom\u00f3c to, \u017ce prawie wszystkie funkcje zosta\u0142y zaimplementowane jako pakiety NuGet).<\/p>\n\n\n\n<p>G\u0142\u00f3wnymi usprawnieniami, kt\u00f3re wprowadzi ze sob\u0105 ASP.NET 5 s\u0105:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Budowanie oraz uruchamianie mi\u0119dzyplatformowych aplikacji internetowych wykorzystuj\u0105cych ASP.NET w \u015brodowiskach Windows, Mac oraz Linux<\/li>\n\n\n\n<li>Tworzenie w oparciu o .NET Core<\/li>\n\n\n\n<li>Nowe narz\u0119dzia, kt\u00f3re u\u0142atwiaj\u0105 tworzenie nowoczesnych aplikacji internetowych<\/li>\n\n\n\n<li>Po\u0142\u0105czenie MVC, Web API oraz Web Pages w jeden model programowania<\/li>\n\n\n\n<li>Optymalizacja pod k\u0105tem korzystania z chmury<\/li>\n\n\n\n<li>Zintegrowane wsparcie dla tworzenia i u\u017cywania pakiet\u00f3w NuGet<\/li>\n\n\n\n<li>Wbudowane wsparcie dla Dependency Injection<\/li>\n\n\n\n<li>Dodana mo\u017cliwo\u015b\u0107 hostowania aplikacji w jej w\u0142asnym procesie lub tak jak dotychczas za pomoc\u0105 IIS<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><u>Wieloplatformowe \u015brodowisko uruchomieniowe<\/u><\/strong><\/h2>\n\n\n\n<p><strong>&nbsp;<\/strong>ASP.NET 5 mo\u017ce pracowa\u0107 w dw\u00f3ch \u015brodowiskach uruchomieniowych, s\u0105 nimi:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>.NET Core \u2013 <\/strong>nowe, modularne, wieloplatformowe \u015brodowisko uruchomieniowe o niewielkich rozmiarach, pozwalaj\u0105ce na uruchamianie naszej aplikacji na wielu platformach (Windows, Linux, Mac OS X). Dodatkowym atutem .NET Core jest to, \u017ce tworzona przez nas aplikacja b\u0119dzie zale\u017cna tylko i wy\u0142\u0105cznie od funkcji, kt\u00f3re wykorzystuje. Oznacza to, ze nigdy nie b\u0119dziemy proszeni o zaktualizowanie, b\u0105d\u017a obs\u0142ug\u0119 funkcji \u015brodowiska uruchomieniowego, kt\u00f3rej nasza aplikacja nie wykorzystuje. Pozwoli to na zaoszcz\u0119dzenie czasu potrzebnego na testowanie, czy te\u017c wdra\u017canie aktualizacji. Mo\u017cemy r\u00f3wnie\u017c wdro\u017cy\u0107 \u015brodowisko .NET Core razem z nasz\u0105 aplikacj\u0105, a co za tym idzie, nasza aplikacja b\u0119dzie dzia\u0142a\u0142a na wdro\u017conym przez nas \u015brodowisku, a nie na tym, kt\u00f3re jest zainstalowane na maszynie (ho\u015bcie). W takim wypadku wersja naszego \u015brodowiska uruchomieniowego b\u0119dzie dzia\u0142a\u0142a r\u00f3wnoleg\u0142e z wersjami dla innych aplikacji. Niesie to za sob\u0105 pewne korzy\u015bci. Jedn\u0105 z nich jest to, i\u017c w razie potrzeby zaktualizowania naszego \u015brodowiska, jeste\u015bmy w stanie przeprowadzi\u0107 j\u0105 bez wp\u0142ywania na inne hostowane na tej maszynie aplikacje. Dzia\u0142a to r\u00f3wnie\u017c w drug\u0105 stron\u0119, je\u015bli zdarzy si\u0119 aktualizacja \u015brodowiska uruchomieniowego zainstalowanego na maszynie, wtedy nie wp\u0142ynie ona na nasz\u0105 aplikacj\u0119.<\/li>\n\n\n\n<li><strong>.NET Framework \u2013 <\/strong>obecne API <strong>.NET Core <\/strong>jest bardziej ograniczone ni\u017c pe\u0142na wersja .NET\u00a0Framework\u2019a. Je\u015bli chcieliby\u015bmy przeportowa\u0107 nasz\u0105 istniej\u0105c\u0105 aplikacj\u0119 by korzysta\u0142a z\u00a0.NET Core, prawdopodobnie wi\u0105za\u0142oby si\u0119 to z przymusem wykonania w niej kilku modyfikacji. Takie rozwi\u0105zanie mo\u017ce oczywi\u015bcie nie wszystkim odpowiada\u0107, w takim wypadku mo\u017cna oczywi\u015bcie uruchamia\u0107 aplikacje wykorzystuj\u0105ce ASP.NET 5 na pe\u0142nej wersji .NET\u00a0Frameworka (wersje od 4.5.2 wzwy\u017c) wtedy nasza istniej\u0105ca ju\u017c aplikacja nie b\u0119dzie wymaga\u0142a \u017cadnych zmian.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><u>MVC 6 \u2013 jeden model programowania<\/u><\/strong><\/h2>\n\n\n\n<p>MVC, Web API oraz Web Pages w poprzednich wydaniach ASP.NET by\u0142y zaimplementowane oddzielnie, problemem tego typu rozwi\u0105zania by\u0142o to, \u017ce posiada\u0142y sporo duplikat\u00f3w i niesp\u00f3jno\u015bci. W&nbsp;MVC 6, framework\u2019i te zosta\u0142y po\u0142\u0105czone w jeden model programowania.<\/p>\n\n\n\n<p>Dodatkowo w MVC 6 zosta\u0142a dodana nowo\u015b\u0107, kt\u00f3ra kryje si\u0119 pod nazw\u0105: <strong>Tag Helpers<\/strong>. Tag Helpers pozwalaj\u0105 na u\u017cycie HTML helper\u2019\u00f3w w widokach poprzez proste rozszerzenie semantyki znacznik\u00f3w w znacznikach. Przyk\u0142adowo, zamiast pisa\u0107:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;div class=&quot;form-group&quot;&gt;\n   @Html.LabelFor(x =&gt; x.CarModel, new { @class = &quot;col-md-2 control-label&quot; })\n   &lt;div class=&quot;col-md-10&quot;&gt;\n      @Html.TextBoxFor(x =&gt; x.CarModel, new { @class = &quot;form-control&quot; })\n      @Html.ValidationMessageFor(x =&gt; x.CarModel, &quot;&quot;, new { @class = &quot;text-danger&quot; })\n   &lt;\/div&gt;\n \n&lt;\/div&gt;\n<\/pre><\/div>\n\n\n<p>Mo\u017cna napisa\u0107:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;div asp-validation-summary=&quot;ModelOnly&quot; class=&quot;text-danger&quot;&gt;&lt;\/div&gt;\n \n&lt;div class=&quot;form-group&quot;&gt;\n   &lt;label asp-for=&quot;CarModel&quot; class=&quot;col-md-2 control-label&quot;&gt;&lt;\/label&gt;\n   &lt;div class=&quot;col-md-10&quot;&gt;\n      &lt;input asp-for=&quot;CarModel&quot; class=&quot;form-control&quot; \/&gt;;\n      &lt;span asp-validation-for=&quot;CarModel&quot; class=&quot;text-danger&quot;&gt;&lt;\/span&gt;\n   &lt;\/div&gt;\n \n&lt;\/div&gt;\n<\/pre><\/div>\n\n\n<p><strong>Tag Helper\u2019y<\/strong> dodatkowo jak mo\u017cna zauwa\u017cy\u0107 powy\u017cej, wp\u0142ywaj\u0105 przede wszystkich na ujednolicenie i czytelno\u015b\u0107 kodu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong><u>Nowoczesne tworzenie aplikacji internetowych<\/u><\/strong><\/h2>\n\n\n\n<p>Jedn\u0105 z nowo\u015bci, jakie znajdziemy w Visual Studio 2015, jest dynamiczna kompilacja, ma ona wp\u0142yn\u0105\u0107 g\u0142\u00f3wnie na sprawn\u0105 prac\u0119 programist\u00f3w. Polega ona na tym, \u017ce nie b\u0119dzie potrzeby ponownej kompilacji po ka\u017cdej zmianie w aplikacji. Dzia\u0142a\u0107 to b\u0119dzie w ten spos\u00f3b, \u017ce wystarczy aby\u015bmy zrobili zmian\u0119 w kodzie, zapisali zmiany, a nast\u0119pnie od\u015bwie\u017cyli stron\u0119 w przegl\u0105darce, w celu zobaczenia zmian.<\/p>\n\n\n\n<p>Kolejnym udogodnieniem, kt\u00f3re zosta\u0142o dodane, to wbudowane wsparcie dla Bower\u2019a, Gunt\u2019a i&nbsp;Gulp\u2019a&nbsp;\u2013 popularnych open source\u2019owych narz\u0119dzi do wytwarzania aplikacji internetowych w&nbsp;Visual&nbsp;Studio 2015.<\/p>\n\n\n\n<p>W ASP.NET 5 mamy mo\u017cliwo\u015b\u0107 zarz\u0105dzania zale\u017cno\u015bciami poprzez dodawanie pakiet\u00f3w NuGet. Mo\u017cna do tego celu u\u017cy\u0107 NuGet Package Manager\u2019a lub po prostu edytowa\u0107 plik JSON (<em>project.json)<\/em>, w kt\u00f3rym przechowywana b\u0119dzie lista pakiet\u00f3w NuGet oraz ich wersje.<\/p>\n\n\n\n<p>ASP.NET 5 eliminuje potrzeb\u0119 przechowywania danych konfiguracyjnych w pliku <em>Web.config<\/em>. Rozwi\u0105zanie to ma na celu uproszczenie wdra\u017cania aplikacji w chmurze. Nowy system konfiguracyjny pozwala odczytywa\u0107 konfiguracj\u0119 z r\u00f3\u017cnych \u017ar\u00f3de\u0142, mog\u0105 by\u0107 to pliki JSON, XML albo zmienne \u015brodowiskowe. To, z jakiego \u017ar\u00f3d\u0142a b\u0119dziemy odczytywali konfiguracj\u0119 dla naszej aplikacji definiowa\u0107 mo\u017cemy w pliku <em>Startup.cs<\/em>.<\/p>\n\n\n\n<p>Na koniec, chcia\u0142bym wspomnie\u0107 r\u00f3wnie\u017c o tym, \u017ce najnowsza wersja ASP.NET posiada wbudowany kontener dla <em>Dependency Injection<\/em>. Oczywi\u015bcie, nic nie stoi na przeszkodzie, aby wybra\u0107 i korzysta\u0107 ze swojego ulubionego kontenera (<em>Autofac, Ninject, itd.)<\/em>.<\/p>\n\n\n\n<p>W tym artykule skupi\u0142em si\u0119 przede wszystkim na nowo\u015bciach, kt\u00f3re wed\u0142ug mnie s\u0105 najwa\u017cniejsze i prze\u0142omowe dla platformy ASP.NET. Zach\u0119cam r\u00f3wnie\u017c wszystkich do zg\u0142\u0119biania tematu ASP.NET 5.<\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;2124&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;1&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;5&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;2&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;5\\\/5&quot;,&quot;size&quot;:&quot;30&quot;,&quot;title&quot;:&quot;MVC vNext - co nowego?&quot;,&quot;width&quot;:&quot;159&quot;,&quot;_legend&quot;:&quot;{score}\\\/5&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 159px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 2px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 30px; height: 30px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 24px;\">\n            5\/5    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>Czym jest ASP.NET? My\u015bl\u0119, \u017ce nikomu nie trzeba t\u0142umaczy\u0107. Po niespe\u0142na 15 latach od ukazania si\u0119 pierwszej wersji ASP.NET 1.0 &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/mvc-vnext-co-nowego\/\">Continued<\/a><\/p>\n","protected":false},"author":76,"featured_media":2475,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[272,295,297],"class_list":["post-2124","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-net","tag-asp-net","tag-vnext"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2016\/03\/MVC-vNext-applikacje-sii-blogersii.jpeg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2124"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/76"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=2124"}],"version-history":[{"count":2,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2124\/revisions"}],"predecessor-version":[{"id":23472,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/2124\/revisions\/23472"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/2475"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=2124"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=2124"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=2124"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}