﻿
{"id":17972,"date":"2020-09-23T22:31:03","date_gmt":"2020-09-23T22:31:03","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=17972"},"modified":"2020-09-23T22:31:03","modified_gmt":"2020-09-23T22:31:03","slug":"asp-net-core-signalr-serisi-9-strongly-typed-hubs","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/asp-net-core-signalr-serisi-9-strongly-typed-hubs\/","title":{"rendered":"Asp.NET Core \u2013 SignalR Serisi #9 &#8211; Strongly Typed Hubs"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<\/p>\n<p>Yaz\u0131l\u0131m uygulamalar\u0131nda sistemler aras\u0131 haberle\u015fmeleri yahut ortak tan\u0131mlamalar\u0131 statik metinsel de\u011ferler \u00fczerinden sa\u011flamaya \u00e7al\u0131\u015fmak, hata yapma ihtimalini artt\u0131rmakta ve b\u00f6ylece s\u00fcrece ister istemez ekstra bir zorluk kazand\u0131r\u0131lmaktad\u0131r. Bu durum SignalR mimarisinde olduk\u00e7a kar\u015f\u0131la\u015f\u0131lmakta ve server&#8217;\u0131n client&#8217;ta ki herhangi bir metodu tetikleyebilmesi i\u00e7in genellikle a\u015fa\u011f\u0131dakine benzer geli\u015ftirilen kodlarda, tan\u0131mlanan metinsel de\u011ferler yer yer yanl\u0131\u015f yaz\u0131labilmekte, kar\u0131\u015ft\u0131r\u0131labilmekte yahut unutulabilmektedir;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class MyHub : Hub\r\n    {\r\n        public async Task SendMessage(string message)\r\n        {\r\n            await Clients.All.SendAsync(&quot;receiveMessage&quot;, message);\r\n        }\r\n    }\r\n<\/pre>\n<p>Burada &#8216;SendMessage&#8217; metodu &#8216;invoke&#8217; edilen hub kendisine ba\u011fl\u0131 olan client&#8217;lar da ki &#8216;receiveMessage&#8217; metodunu tetiklemektedir. Haliyle buradaki &#8216;reveiveMessage&#8217; de\u011ferinin metinsel olmas\u0131 her ne kadar client&#8217;ta tetiklenecek olan metodun net bildirilmesini sa\u011fl\u0131yor olsada, derleme a\u00e7\u0131s\u0131ndan herhangi bir denetime tabii tutulmamas\u0131ndan dolay\u0131 yer yer SignalR uygulamas\u0131ndaki standart\u0131 sa\u011flama \u00e7abas\u0131nda ekstra enerji sarf edilmesini gerektirmekte ve bunun yan\u0131nda programatik bir davran\u0131\u015ftan uzak bir \u015fekilde kod geli\u015ftirilmesine sebebiyet vermektedir.<\/p>\n<p><em>Strongly Typed Hubs<\/em> \u00f6zelli\u011fi ile t\u00fcr\u00fc kesin belirlenmi\u015f hub&#8217;lar tan\u0131mlayarak, metinsel yap\u0131lanman\u0131n yaratt\u0131\u011f\u0131 handikaplardan bir nebze olsun ar\u0131nabilmeyi ve client&#8217;ta tetiklenecek olan metot bildiriminin server&#8217;da derleme zaman\u0131ndaki denetimini etkinle\u015ftirmeyi sa\u011flayabiliriz. Bunun i\u00e7in bir interface arac\u0131l\u0131\u011f\u0131yla client&#8217;ta tetiklenecek olan metotlar\u0131n imzalar\u0131n\u0131n modellenmesi ve ilgili Hub&#8217;a bildirilmesi yeterlidir.<\/p>\n<p>\u015e\u00f6yle ki;<\/p>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public interface IMessageClient\r\n    {\r\n        Task ReceiveMessage(string message);\r\n    }\r\n<\/pre>\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class MyHub : Hub&lt;IMessageClient&gt;\r\n    {\r\n        public async Task SendMessage(string message)\r\n        {\r\n            await Clients.All.ReceiveMessage(message);\r\n        }\r\n    }\r\n<\/pre>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere &#8216;Hub&#8217; s\u0131n\u0131f\u0131 generic olarak olu\u015fturulan interface&#8217;i almakta ve ard\u0131ndan client&#8217;lara yap\u0131lacak isteklerde ilgili metot \u00fczerinden tetiklemeyi ba\u015far\u0131yla sa\u011flamaktad\u0131r. B\u00f6ylece tetikleyici unsur daha programatik bir davran\u0131\u015fla devreye sokulmakta ve bir yandan da esas \u00f6nemlisi derleyici taraf\u0131ndan denetim sa\u011flanarak olas\u0131 hatalar ortadan kald\u0131r\u0131lmaktad\u0131r.<\/p>\n<p>Bu y\u00fczden Strongly Typed Hubs \u00f6zelli\u011finin kullan\u0131lmas\u0131n\u0131 ve client&#8217;lar da tetiklenecek olan metotlar\u0131n bu \u015fekilde belirlenmesini kesinlikle \u00f6nemser ve tavsiye ederim.<\/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<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Yaz\u0131l\u0131m uygulamalar\u0131nda sistemler aras\u0131 haberle\u015fmeleri yahut ortak tan\u0131mlamalar\u0131 statik metinsel de\u011ferler \u00fczerinden sa\u011flamaya \u00e7al\u0131\u015fmak, hata yapma ihtimalini artt\u0131rmakta ve b\u00f6ylece s\u00fcrece ister istemez ekstra bir zorluk kazand\u0131r\u0131lmaktad\u0131r. Bu durum SignalR mimarisinde olduk\u00e7a kar\u015f\u0131la\u015f\u0131lmakta&#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":[3762,639,3812,3811],"class_list":["post-17972","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-signalr","tag-asp-net-core-signalr","tag-signalr","tag-signalr-strongly-typed-hubs","tag-strongly-typed-hubs"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17972","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=17972"}],"version-history":[{"count":11,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17972\/revisions"}],"predecessor-version":[{"id":17983,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/17972\/revisions\/17983"}],"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=17972"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=17972"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=17972"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}