SelamünAleyküm, geçtiğimiz yazıda SignalR'da Bağlantı olaylarını ele almıştık. Bu yazıda ise IHubContext class'ının nasıl kullanıldığını ele alacağız.
IHubContext, Asp .Net Core'un temel bir arayüzü diyebiliriz. Hub'a erişmek için herhangi bir class ya da controller vb. arabirimler aracılığı ile client ve server arasındaki haberleşmeyi sağlar. IHubContext'i projmizde ki herhangi bir class ve controller üzerinde Dependency Injection ile bir instance'ını şeklinde kullanabiliriz.
IHub Context'i, Dependcy Injection ile bir Controller veya Middleware vb. yaplanmalarında kullanabiliriz, bu IHubContext' projemizin herhangi bir yerinden ulaşabileciğimiz anlamına gelir.
IHubContext özünde bir interface'tir ( arayüz'dür ). IHubContext'i kullanabilmek için fıtraten bir Hub yapısına ihtiyacımız olacaktır, bu nedenle yeni bir .Net Core projesi oluşturalım. Yeni bir Hub yapılanması hazırlayalım.
public class MessageHub : Hub
{
List<string> clients = new List<string>();
public async Task SendMessageAsync(string message, string user)
{
await Clients.All.SendAsync("receiverMessage", message, user);
}
public override async Task OnConnectedAsync()
{
clients.Add(Context.ConnectionId);
await Clients.All.SendAsync("userJoined", Context.ConnectionId);
await Clients.All.SendAsync("clients", clients);
}
public override async Task OnDisconnectedAsync(Exception? exception)
{
clients.Remove(Context.ConnectionId);
await Clients.All.SendAsync("userLeaved", Context.ConnectionId);
await Clients.All.SendAsync("clients", clients);
}
}
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddSignalR();
builder.Services.AddCors(opt => opt.AddDefaultPolicy(policy =>
policy.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()
.SetIsOriginAllowed(origin => true)
));
builder.Services.AddControllersWithViews();
var app = builder.Build();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
app.MapHub<MessageHub>("/messagehub");
app.Run();
Şimdi hazırladığımız bu Hub yapılanmasını ister bir Contorller veya herhangi bir Class üzerinden ilerletelim. Bu şekilde herhangi bir Class üzerinden hazırladığımız Hub yapılanmasını, Hub dışında kullanabileceğiz.
//MessageHub Class'ı
public class MessageBusinnes
{
private readonly IHubContext<MessageHub> _hubContext;
public MessageBusinnes(IHubContext<MessageHub> hubContext)
{
_hubContext = hubContext;
}
public async Task MessageAsync(string message, string user)
{
await _hubContext.Clients.All.SendAsync("receiverMessage", message, user);
}
}
//Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddScoped<MessageBusinnes>();
builder.Services.AddSignalR();
builder.Services.AddCors(opt => opt.AddDefaultPolicy(policy =>
policy.AllowAnyMethod()
.AllowAnyHeader()
.AllowCredentials()
.SetIsOriginAllowed(origin => true)
));
builder.Services.AddControllersWithViews();
var app = builder.Build();
app.MapControllerRoute(
name: "default",
pattern: "{controller=Message}/{action=Index}/{id?}");
app.MapHub<MessageHub>("/messagehub");
app.Run();
public class MessageController : Controller
{
private readonly MessageBusinnes _messageBusinnes;
public MessageController(MessageBusinnes messageBusinnes)
{
_messageBusinnes = messageBusinnes;
}
public async Task<IActionResult> Index()
{
await _messageBusinnes.MessageAsync("SelamünAleyküm", "Admin");
return View();
}
}
Görüleceği üzere hazırladığımız class ile doğrudan olmasada dolaylı olarak hub'ı kullanmış olduk. Hub dışı ileti göndermek için class'ımızı constructor'dan talep ettiğimiz IHubContext türündeki nesnemizi "Program.cs" class'ımız üzerinden projemize inject ettik. Ardından bu class'ı Controller da ( Genel olarak neredeyse bütün örneklendirmeler controller üzerinden yürüdüğü için biz de controller üzerinden örneklendirme yapacağız. ) Dependency Injection ile talep ettik.
Projemizi Çalıştıralım.
Video ekle.
Şimdi ise herhangi bir class'ı aracı kılmadan Hub'ımızı direkt olarak controller üzerinden IHubContext'imiz Dependency Injection ile çağıralım.
public class MessageController : Controller
{
private readonly MessageBusinnes _messageBusinnes;
private readonly IHubContext<MessageHub> _hubContext;
public MessageController(MessageBusinnes messageBusinnes, IHubContext<MessageHub> hubContext)
{
_messageBusinnes = messageBusinnes;
_hubContext = hubContext;
}
public async Task<IActionResult> Index(string message, string user)
{
message = "SelamünAleyküm";
user = "Admin";
//await _messageBusinnes.MessageAsync("SelamünAleyküm", "Admin");
await _hubContext.Clients.All.SendAsync("receiverMessage", message, user);
return Ok();
}
}
Bu şekilde kullansakta yukarıda bıraktığım video'daki sonucu aynen alacaksınız.
Bu yazımızın sonuna geldik. Bu yazıda IHubContext interface'ının kullanımını ele aldık. İlgili projenin github adresine buradan ulaşabilirsiniz. İlgilenenlerin faydalanması ümidiyle.
Validation 2 - Regular Expression ve Client - Side Validation
Devamı OkuYazılım, teknoloji ve daha fazlası için bizi takip edin.
© Techno Guide. Tüm Hakları Saklıdır.
HTML Codex Tasarımıdır.