SignalR Group Kullanımı

Merhabalar, bu yazımızda SignalR group kullanımını basit bir proje üzerinden anlatacağım.

Projemizde bire-çok (one-to-many) bağlantılı bir category ve product modeli oluşturuyoruz.

 public class Category
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public virtual ICollection<Product> Products { get; set; }

        public Category()
        {
            Products = new List<Product>();
        }
    }

  public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }

        public Category Category { get; set; }
    }

        public DbSet<Category> Categories { get; set; }
        public DbSet<Product> Products { get; set; }

ve ProductHub class’ı oluşturuyoruz ve Hub dan miras alıyoruz. İçine group oluşumları için gerekli metodları yazıyoruz. 4 tane metodumuz var bunlar;

  • Grup oluşturma
  • Gruba veri atama
  • Grup silme
  • Grup içindeki verileri çekme

Grup oluşturma

 public async Task AddToGroup(string teamName)
        {
            await Groups.AddToGroupAsync(Context.ConnectionId, teamName);
        }

Gruba veri atama

 public async Task SendNameByGroup(string Name, string categoryName)
        {
            var category = _context.Categories.Where(x => x.Name == categoryName).FirstOrDefault();
            if (category != null)
            {
                category.Products.Add(new Product { Name = Name });
            }
            else
            {
                var newCategories = new Category { Name = categoryName };
                newCategories.Products.Add(new Product { Name = Name });
                _context.Categories.Add(newCategories);
            }
            await _context.SaveChangesAsync();

            await Clients.Group(categoryName).SendAsync("ReceiveSendNameByGroup", Name, category.Id);
        }

Grup silme

 public async Task RemoveToGroup(string categoryName)
        {
            await Groups.RemoveFromGroupAsync(Context.ConnectionId, categoryName);
        }

Grup içindeki verileri çekme

    public async Task GetNamesByGroup()
        {
            var categories = _context.Categories.Include(x => x.Products).Select(x => new
            {
                categoriesId = x.Id,
                Products = x.Products.ToList()
            });
           
            await Clients.All.SendAsync("ReceiveGetNamesByGroup", categories);
        }

Server taraflı kodlarımız bitti client tarafını düzenleyelim şimdi. Script bölümü;

 <script src="~/lib/microsoft/signalr/dist/browser/signalr.js"></script>
    <script type="text/javascript">
        var conn = new signalR.HubConnectionBuilder().withUrl("/ProductHub").build();

        conn.start().then(() => {
            conn.invoke("GetNamesByGroup");
        })
        conn.on("ReceiveGetNamesByGroup", (categories) => {

            categories.forEach((category, index) => {
                let listName;
                if (category.categoryId == 1) {
                    listName = "MeyveList";
                }
                else
                    listName = "SebzeList";

                category.products.forEach((product, index2) => {

                    $(`#${listName}`).append(`<li class="list-group-item">${product.name}</li>`)
                })
            })
        })
        conn.on("ReceiveSendNameByGroup", (name, id) => {
            let listName;           
            if (id == 1) {

                listName = "MeyveList";
            }
            else
                listName = "SebzeList";
          
            $(`#${listName}`).append(`<li class="list-group-item">${name}</li>`)
        })
        $('#btnProduct').click(() => {
            let name = $("#txtProduct").val();
            let category = $("input[type=radio]:checked").val();
           
            if (category == null) {
                alert("Kategori Seçiniz");
                return;
            }
            conn.invoke("SendNameByGroup", name, category);
        })
        $("input[type=radio]").change(() => {

            let value = $('input[type=radio]:checked').val();

            if (value == "Meyve") {
                conn.invoke("AddToGroup", value);

                conn.invoke("RemoveToGroup", "Sebze");
            }
            else {
                conn.invoke("AddToGroup", value);
                conn.invoke("RemoveToGroup", "Meyve");

            }
        })
    </script>

Şimdi html tarafına geçelim ;

<div class="row">
    <div class="col-md-4 offset-2">
        <input type="text" id="txtProduct" class="form-control" />
        <hr />
        <div class="form-check form-check-inline">
            <input class="form-check-input" type="radio" name="TeamGroup" value="Meyve" />
            <label class="form-check-label">Meyve</label>    

            <div class="form-check form-check-inline">
                <input class="form-check-input" type="radio" name="TeamGroup" value="Sebze" />
                <label class="form-check-label">Sebze</label>
            </div>
        </div>
        <button class="btn btn-success" id="btnProduct">
            Ürün Kaydet
        </button> 
    </div>
    <hr />
    <div class="col-md-8 offset-2">
        <hr />
        <div class="row">
            <div class="col-md-6">
                <ul class="list-group" id="MeyveList">
                </ul>
            </div>
            <div class="col-md-6">
                <ul class="list-group" id="SebzeList">
                </ul>
            </div>
        </div>
    </div>
</div>

Şimdi ekran çıktımızı gösterelim;

Evet yazımızın sonuna geldik. Bir sonraki yazıda görüşmek üzere. Sağlıcakla kalın.

Bir cevap yazın