﻿
{"id":17846,"date":"2020-09-16T07:00:58","date_gmt":"2020-09-16T07:00:58","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=17846"},"modified":"2020-09-16T07:00:58","modified_gmt":"2020-09-16T07:00:58","slug":"asp-net-core-signalr-serisi-7-signalr-server-ihubcontextt-interfacei-ile-hub-disi-ileti-gonderme","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-signalr-serisi-7-signalr-server-ihubcontextt-interfacei-ile-hub-disi-ileti-gonderme\/","title":{"rendered":"Asp.NET Core \u2013 SignalR Serisi #7 &#8211; SignalR Server IHubContext&lt;T&gt; Interface&#8217;i \u0130le Hub D\u0131\u015f\u0131 \u0130leti G\u00f6nderme"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde, server&#8217;a ba\u011fl\u0131 client&#8217;lara ileti g\u00f6ndermeye y\u00f6nelik temel soyutlama yapmam\u0131z\u0131 sa\u011flayan ve b\u00f6ylece ileti g\u00f6nderimini Hub d\u0131\u015f\u0131 kontrol haline getiren SignalR IHubContext&lt;T&gt; interface&#8217;i \u00fczerine konu\u015fuyor olaca\u011f\u0131z.<\/p>\n<h3 style=\"color: #e83e8c;\">IHubContext&lt;T&gt; Interface&#8217;i Nedir? Ne \u0130\u015fe Yarar?<\/h3>\n<p>IHubContext&lt;T&gt; interface&#8217;i, &#8216;Hub&#8217; s\u0131n\u0131flar\u0131n\u0131n d\u0131\u015f\u0131nda SignalR mimarisini kullanmam\u0131z\u0131 ve b\u00f6ylece farkl\u0131 bir s\u0131n\u0131f yahut controller vs. gibi yap\u0131lar \u00fczerinden client ile server aras\u0131nda etkile\u015fime girmemizi sa\u011flayan bir soyutlamad\u0131r. IHubContext&lt;T&gt; interface&#8217;i sayesinde geli\u015ftirilen context \u00f6rne\u011fi Dependency Injection provider&#8217;\u0131na instance olarak eklenebilmekte ve kurumsal yap\u0131lanmalarda daha \u015f\u0131k ve mimarisel bir yakla\u015f\u0131m sergilenebilmektedir.<\/p>\n<h3 style=\"color: #e83e8c;\">IHubContext&lt;T&gt; Interface&#8217;i Nas\u0131l Kullan\u0131l\u0131r?<\/h3>\n<p>IHubContext&lt;T&gt; interface&#8217;ini kullanabilmek i\u00e7in yap\u0131sal olarak bir Hub&#8217;a ihtiya\u00e7 vard\u0131r. Yani her halukarda bir Hub tasarlaman\u0131z ve &#8216;Startup.cs&#8217; dosyas\u0131nda servis olarak eklemeniz gerekmektedir.<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class MyHub : Hub\r\n    {\r\n        public async Task SendMessageAsync(string message)\r\n        {\r\n            await Clients.All.SendAsync(&quot;receiveMessage&quot;, message);\r\n        }\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            services.AddSignalR();\r\n        }\r\n\r\n        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            app.UseEndpoints(endpoints =&gt;\r\n            {\r\n                endpoints.MapControllers();\r\n                endpoints.MapHub&lt;MyHub&gt;(&quot;\/myhub&quot;);\r\n            });\r\n        }\r\n    }\r\n<\/pre>\n<p>Ard\u0131ndan bu Hub&#8217;\u0131 kullanarak herhangi bir class yahut controller \u00fczerinden Hub d\u0131\u015f\u0131 bir etkile\u015fime girmek istiyorsan\u0131z e\u011fer a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015fma sergileyebilirsiniz;<br \/>\n<strong>Class \u00dczerinde Hub D\u0131\u015f\u0131 \u0130leti G\u00f6nderimi<\/strong><br \/>\nClass;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class MyClass\r\n    {\r\n        readonly IHubContext&lt;MyHub&gt; _hubContext;\r\n        public MyClass(IHubContext&lt;MyHub&gt; hubContext)\r\n        {\r\n            _hubContext = hubContext;\r\n        }\r\n        public async Task SendMessageAsync(string message)\r\n        {\r\n            await _hubContext.Clients.All.SendAsync(&quot;receiveMessage&quot;, message);\r\n        }\r\n    }\r\n<\/pre>\n<p>Startup;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class Startup\r\n    {\r\n        public void ConfigureServices(IServiceCollection services)\r\n        {\r\n            .\r\n            .\r\n            .\r\n            services.AddTransient&lt;MyClass&gt;();\r\n            .\r\n            .\r\n            .\r\n        }\r\n        .\r\n        .\r\n        .\r\n    }\r\n<\/pre>\n<p>Controller;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\r\n    &#x5B;ApiController]\r\n    public class HomeController : ControllerBase\r\n    {\r\n        MyClass _myClass;\r\n        public HomeController(MyClass myClass)\r\n        {\r\n            _myClass = myClass;\r\n        }\r\n        async public Task&lt;IActionResult&gt; Index()\r\n        {\r\n            await _myClass.SendMessageAsync(&quot;Merhaba&quot;);\r\n            return Ok();\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere class \u00fczerinden Hub d\u0131\u015f\u0131 ileti g\u00f6nderimini ger\u00e7ekle\u015ftirebilmek i\u00e7in class&#8217;\u0131n constructor&#8217;\u0131ndan talep edilen IHubContext&lt;T&gt; t\u00fcr\u00fcnden nesneyi &#8216;Startup.cs&#8217; dosyas\u0131 \u00fczerinden uygulamaya enjekte etmemiz gerekiyor. Ard\u0131ndan bu s\u0131n\u0131f\u0131 controller&#8217;lar da(ki genellikle controller&#8217;da kullan\u0131labilme olas\u0131l\u0131\u011f\u0131 y\u00fcksek oldu\u011fu i\u00e7in controller \u00f6rneklendirilmi\u015ftir) dependency injection ile talep ediyoruz. Aksi taktirde ilgili s\u0131n\u0131f\u0131n nesnesini &#8216;new&#8217; ile olu\u015ftursayd\u0131k constructor&#8217;\u0131nda isteyece\u011fi Hub context&#8217;ine kar\u015f\u0131 manuel olarak bir nesne verememekteyiz. Velhas\u0131l-\u0131 kelam bu \u015fekilde yap\u0131lan bir \u00e7al\u0131\u015fma neticesinde &#8216;MyClass&#8217; nesnesi \u00fczerinden SignalR teknolojisi kullan\u0131larak client ile server aras\u0131nda e\u015fzamanl\u0131 bir etkile\u015fime a\u015fa\u011f\u0131daki ekran g\u00f6r\u00fcnt\u00fcs\u00fcnde de oldu\u011fu gibi girilebilmektedir.<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-7-SignalR-Server-IHubContext-Interfacei-Ile-Hub-Disi-Ileti-Gonderme.gif\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/Asp.NET-Core-\u2013-SignalR-Serisi-7-SignalR-Server-IHubContext-Interfacei-Ile-Hub-Disi-Ileti-Gonderme.gif\" alt=\"Asp.NET Core \u2013 SignalR Serisi #7 - SignalR Server IHubContext Interface&#039;i \u0130le Hub D\u0131\u015f\u0131 \u0130leti G\u00f6nderme\" width=\"700\" height=\"406\" class=\"aligncenter size-full wp-image-17860\" \/><\/a><br \/>\n<strong>Controller \u00dczerinde Hub D\u0131\u015f\u0131 \u0130leti G\u00f6nderimi<\/strong><br \/>\nIHubContext&lt;T&gt; interface&#8217;i controller class&#8217;lar\u0131 \u00fczerinden herhangi bir class&#8217;a ihtiya\u00e7 duymaks\u0131z\u0131n direkt olarak DI ile talep edilebilir. \u015e\u00f6yle ki;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    &#x5B;Route(&quot;api\/&#x5B;controller]&quot;)]\r\n    &#x5B;ApiController]\r\n    public class HomeController : ControllerBase\r\n    {\r\n        IHubContext&lt;MyHub&gt; _hubContext;\r\n        public HomeController(IHubContext&lt;MyHub&gt; hubContext)\r\n        {\r\n            _hubContext = hubContext;\r\n        }\r\n        async public Task&lt;IActionResult&gt; Index()\r\n        {\r\n            await _hubContext.Clients.All.SendAsync(&quot;receiveMessage&quot;, &quot;Merhaba&quot;);\r\n            return Ok();\r\n        }\r\n    }\r\n<\/pre>\n<p>\u015feklinde \u00e7al\u0131\u015farak ayn\u0131 neticeyi elde edebilirsiniz.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<p>Not: \u00d6rnek uygulamay\u0131 indirebilmek i\u00e7in <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2020\/09\/SignalRExample-1.zip\">buraya<\/a> t\u0131klay\u0131n\u0131z.<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde, server&#8217;a ba\u011fl\u0131 client&#8217;lara ileti g\u00f6ndermeye y\u00f6nelik temel soyutlama yapmam\u0131z\u0131 sa\u011flayan ve b\u00f6ylece ileti g\u00f6nderimini Hub d\u0131\u015f\u0131 kontrol haline getiren SignalR IHubContext&lt;T&gt; interface&#8217;i \u00fczerine konu\u015fuyor olaca\u011f\u0131z. IHubContext&lt;T&gt; Interface&#8217;i Nedir? Ne \u0130\u015fe Yarar?&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":17653,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[3760],"tags":[3793,3799,639,3795,3794],"class_list":["post-17846","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-signalr","tag-ihubcontext","tag-ihubcontext-interfacei-nedir","tag-signalr","tag-signalr-ihubcontext","tag-signalr-ihubcontext-interface"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17846","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=17846"}],"version-history":[{"count":13,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17846\/revisions"}],"predecessor-version":[{"id":17864,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17846\/revisions\/17864"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/17653"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=17846"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=17846"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=17846"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}