{"id":65,"date":"2020-09-24T11:18:16","date_gmt":"2020-09-24T09:18:16","guid":{"rendered":"https:\/\/mtymejczyk.wordpress.com\/?p=65"},"modified":"2020-09-24T11:18:16","modified_gmt":"2020-09-24T09:18:16","slug":"poczatek-projektu","status":"publish","type":"post","link":"https:\/\/tymejczyk.net\/index.php\/2020\/09\/24\/poczatek-projektu\/","title":{"rendered":"CoffeShop cz. 1 &#8211; Pocz\u0105tek projektu"},"content":{"rendered":"\n<p><strong>Z<\/strong>a\u0142o\u017cy\u0142em pust\u0105 Solucje i doda\u0142em do niej poszczeg\u00f3lne projekty reprezentuj\u0105ce warstwy aplikacji wraz z powi\u0105zaniami \u017ceby m\u00f3c wykorzysta\u0107 <em>Dependency Injection<\/em>.<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"294\" height=\"515\" src=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/09\/image-3.png?w=294\" alt=\"\" class=\"wp-image-72\" srcset=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/09\/image-3.png 294w, https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/09\/image-3-171x300.png 171w\" sizes=\"auto, (max-width: 294px) 100vw, 294px\" \/><figcaption>Struktura projektu<\/figcaption><\/figure><\/div>\n\n\n\n<p>Na poczatek chcia\u0142bym zrobi\u0107 proste API z u\u017cyciem MediatR i CQRS do pobierania zmockowanych zam\u00f3wie\u0144 i produkt\u00f3w.<br><\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\">using MediatR;\n\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Mvc;\nusing Microsoft.Extensions.DependencyInjection;\n\nnamespace Presentation.Controllers\n{\n    [Route(\"api\/[controller]\")]\n    [ApiController]\n    public class BaseController : ControllerBase\n    {\n        private IMediator _mediator;\n\n        protected IMediator Mediator\n            =&gt; _mediator ??= HttpContext.RequestServices.GetService&lt;IMediator&gt;();\n    }\n}<\/pre>\n\n\n\n<p>Dzi\u0119ki za\u0142\u0105czeniu Atrybut\u00f3w <em>Route <\/em>i <em>ApiController <\/em>w tej klasie nie ma potrzeby przepisywac ich do klas pochodnych poniewa\u017c s\u0105 dziedziczone \ud83d\ude00 <br><br>Wszystkie <em>Command <\/em>i <em>Queries <\/em>b\u0119d\u0105 umieszczone w warstwie aplikacji. <br>Poni\u017cej prezentuje GetAll dla zmockowanych produkt\u00f3w. <br><\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\">using Domain.Entities;\n\nusing MediatR;\n\nusing System.Collections.Generic;\nusing System.Threading;\nusing System.Threading.Tasks;\n\nnamespace Application.Products.Query.GetAllProductsQuery\n{\n    public class GetAllProductsQuery : IRequest&lt;List&lt;Product&gt;&gt;\n    {\n        public class GetAllProductsQueryHandler : IRequestHandler&lt;GetAllProductsQuery, List&lt;Product&gt;&gt;\n        {\n            public async Task&lt;List&lt;Product&gt;&gt; Handle(GetAllProductsQuery request, CancellationToken cancellationToken)\n            {\n                var products = new List&lt;Product&gt;\n                {\n                    new Product { Id = 1, Name = \"Cappuccino S\", Price = 5.99m, Quantity = 0 },\n                    new Product { Id = 2, Name = \"Cappuccino M\", Price = 8.99m, Quantity = 0 },\n                    new Product { Id = 3, Name = \"Cappuccino L\", Price = 9.99m, Quantity = 0 },\n                    new Product { Id = 4, Name = \"Espresso\", Price = 4.99m, Quantity = 0 },\n                    new Product { Id = 5, Name = \"Espresso Doppio\", Price = 5.99m, Quantity = 0 },\n                    new Product { Id = 6, Name = \"Americano S\", Price = 4.99m, Quantity = 0 },\n                    new Product { Id = 7, Name = \"Americano M\", Price = 6.99m, Quantity = 0 },\n                    new Product { Id = 8, Name = \"Americano L\", Price = 8.99m, Quantity = 0 }\n                };\n\n                return products;\n            }\n        }\n    }\n}\n<\/pre>\n\n\n\n<p>Kontroler:<\/p>\n\n\n\n<pre class=\"wp-block-syntaxhighlighter-code\">using System;\nusing System.Collections.Generic;\nusing System.Linq;\nusing System.Threading.Tasks;\n\nusing Application.Products.Query.GetAllProductsQuery;\n\nusing Domain.Entities;\n\nusing Microsoft.AspNetCore.Http;\nusing Microsoft.AspNetCore.Mvc;\n\nnamespace Presentation.Controllers\n{\n    public class ProductsController : BaseController\n    {\n        [HttpGet]\n        public async Task&lt;List&lt;Product&gt;&gt; GetAll()\n        {\n            return await Mediator.Send(new GetAllProductsQuery());\n        }\n    }\n}<\/pre>\n\n\n\n<p>Teraz wszystko dzia\u0142a kiedy przejdziemy pod &lt;a rel=&#8221;noreferrer noopener&#8221; href=&#8221;https:\/\/localhost:https:\/\/localhost:&lt;port&gt;\/api\/products, ale zawsze mo\u017cna lepiej. Dlatego zainstalujemy pakiet <a rel=\"noreferrer noopener\" href=\"https:\/\/docs.microsoft.com\/en-us\/aspnet\/core\/tutorials\/getting-started-with-swashbuckle?view=aspnetcore-3.1&amp;tabs=visual-studio\" target=\"_blank\">Swashbuckle Swagger<\/a> pami\u0119taj\u0105c \u017ce powinien by\u0107 on dost\u0119pny jedynie w \u015brodowisku <em>Dev<\/em> \ud83d\ude00 <br><br>Po przej\u015bciu pod &#8230; ukazuje si\u0119 <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"887\" height=\"569\" src=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/09\/image-4.png?w=887\" alt=\"\" class=\"wp-image-79\" srcset=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/09\/image-4.png 887w, https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/09\/image-4-300x192.png 300w, https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/09\/image-4-768x493.png 768w\" sizes=\"auto, (max-width: 887px) 100vw, 887px\" \/><\/figure>\n\n\n\n<p>Otwieramy interesuj\u0105cy nas endpoint i w niego strzelamy \ud83d\ude00 <br>Dostajemy odpowied\u017a wraz z list\u0105 dost\u0119pnych kaw. <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"834\" height=\"591\" src=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/09\/image-5.png?w=834\" alt=\"\" class=\"wp-image-81\" srcset=\"https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/09\/image-5.png 834w, https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/09\/image-5-300x213.png 300w, https:\/\/tymejczyk.net\/wp-content\/uploads\/2020\/09\/image-5-768x544.png 768w\" sizes=\"auto, (max-width: 834px) 100vw, 834px\" \/><\/figure>\n\n\n\n<p>Ca\u0142y kod zamieszczam na github: <a href=\"https:\/\/github.com\/MichaelStett\/CoffeShop\">https:\/\/github.com\/MichaelStett\/CoffeShop<\/a><br><br>Dzi\u0119kuje za Twoj\u0105 uwag\u0119 i do nast\u0119pnego \ud83d\ude00 <\/p>\n","protected":false},"excerpt":{"rendered":"<p>Za\u0142o\u017cy\u0142em pust\u0105 Solucje i doda\u0142em do niej poszczeg\u00f3lne projekty reprezentuj\u0105ce warstwy aplikacji wraz z powi\u0105zaniami \u017ceby m\u00f3c wykorzysta\u0107 Dependency Injection. Na poczatek chcia\u0142bym zrobi\u0107 proste API z u\u017cyciem MediatR i CQRS do pobierania zmockowanych zam\u00f3wie\u0144 i produkt\u00f3w. Dzi\u0119ki za\u0142\u0105czeniu Atrybut\u00f3w Route i ApiController w tej klasie nie ma potrzeby przepisywac ich do klas pochodnych poniewa\u017c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":67,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-65","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-project-coffeshop"],"_links":{"self":[{"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/posts\/65","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/comments?post=65"}],"version-history":[{"count":0,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/posts\/65\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/media\/67"}],"wp:attachment":[{"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/media?parent=65"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/categories?post=65"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/tymejczyk.net\/index.php\/wp-json\/wp\/v2\/tags?post=65"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}