Asp.NET Core – SignalR Serisi #7 – SignalR Server IHubContext<T> Interface’i İle Hub Dışı İleti Gönderme

Merhaba,

Bu içeriğimizde, server’a bağlı client’lara ileti göndermeye yönelik temel soyutlama yapmamızı sağlayan ve böylece ileti gönderimini Hub dışı kontrol haline getiren SignalR IHubContext<T> interface’i üzerine konuşuyor olacağız.

IHubContext<T> Interface’i Nedir? Ne İşe Yarar?

IHubContext<T> interface’i, ‘Hub’ sınıflarının dışında SignalR mimarisini kullanmamızı ve böylece farklı bir sınıf yahut controller vs. gibi yapılar üzerinden client ile server arasında etkileşime girmemizi sağlayan bir soyutlamadır. IHubContext<T> interface’i sayesinde geliştirilen context örneği Dependency Injection provider’ına instance olarak eklenebilmekte ve kurumsal yapılanmalarda daha şık ve mimarisel bir yaklaşım sergilenebilmektedir.

IHubContext<T> Interface’i Nasıl Kullanılır?

IHubContext<T> interface’ini kullanabilmek için yapısal olarak bir Hub’a ihtiyaç vardır. Yani her halukarda bir Hub tasarlamanız ve ‘Startup.cs’ dosyasında servis olarak eklemeniz gerekmektedir.

    public class MyHub : Hub
    {
        public async Task SendMessageAsync(string message)
        {
            await Clients.All.SendAsync("receiveMessage", message);
        }
        .
        .
        .
    }
    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            .
            .
            .
            services.AddSignalR();
        }

        public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            .
            .
            .
            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.MapHub<MyHub>("/myhub");
            });
        }
    }

Ardından bu Hub’ı kullanarak herhangi bir class yahut controller üzerinden Hub dışı bir etkileşime girmek istiyorsanız eğer aşağıdaki gibi çalışma sergileyebilirsiniz;
Class Üzerinde Hub Dışı İleti Gönderimi
Class;

    public class MyClass
    {
        readonly IHubContext<MyHub> _hubContext;
        public MyClass(IHubContext<MyHub> hubContext)
        {
            _hubContext = hubContext;
        }
        public async Task SendMessageAsync(string message)
        {
            await _hubContext.Clients.All.SendAsync("receiveMessage", message);
        }
    }

Startup;

    public class Startup
    {
        public void ConfigureServices(IServiceCollection services)
        {
            .
            .
            .
            services.AddTransient<MyClass>();
            .
            .
            .
        }
        .
        .
        .
    }

Controller;

    [Route("api/[controller]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        MyClass _myClass;
        public HomeController(MyClass myClass)
        {
            _myClass = myClass;
        }
        async public Task<IActionResult> Index()
        {
            await _myClass.SendMessageAsync("Merhaba");
            return Ok();
        }
    }

Görüldüğü üzere class üzerinden Hub dışı ileti gönderimini gerçekleştirebilmek için class’ın constructor’ından talep edilen IHubContext<T> türünden nesneyi ‘Startup.cs’ dosyası üzerinden uygulamaya enjekte etmemiz gerekiyor. Ardından bu sınıfı controller’lar da(ki genellikle controller’da kullanılabilme olasılığı yüksek olduğu için controller örneklendirilmiştir) dependency injection ile talep ediyoruz. Aksi taktirde ilgili sınıfın nesnesini ‘new’ ile oluştursaydık constructor’ında isteyeceği Hub context’ine karşı manuel olarak bir nesne verememekteyiz. Velhasıl-ı kelam bu şekilde yapılan bir çalışma neticesinde ‘MyClass’ nesnesi üzerinden SignalR teknolojisi kullanılarak client ile server arasında eşzamanlı bir etkileşime aşağıdaki ekran görüntüsünde de olduğu gibi girilebilmektedir.
Asp.NET Core – SignalR Serisi #7 - SignalR Server IHubContext Interface'i İle Hub Dışı İleti Gönderme
Controller Üzerinde Hub Dışı İleti Gönderimi
IHubContext<T> interface’i controller class’ları üzerinden herhangi bir class’a ihtiyaç duymaksızın direkt olarak DI ile talep edilebilir. Şöyle ki;

    [Route("api/[controller]")]
    [ApiController]
    public class HomeController : ControllerBase
    {
        IHubContext<MyHub> _hubContext;
        public HomeController(IHubContext<MyHub> hubContext)
        {
            _hubContext = hubContext;
        }
        async public Task<IActionResult> Index()
        {
            await _hubContext.Clients.All.SendAsync("receiveMessage", "Merhaba");
            return Ok();
        }
    }

şeklinde çalışarak aynı neticeyi elde edebilirsiniz.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not: Örnek uygulamayı indirebilmek için buraya tıklayınız.

Bunlar da hoşunuza gidebilir...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*