2013-07-27 21 views
15

SignalR 2 kullanıyorum ve Hub yöntemlerimi nasıl kullanabileceğimi anlayamıyorum e.g bir denetleyici eyleminin içinden.Hub yöntemlerini denetleyiciden mi kullanıyorsunuz?

ben aşağıdakileri yapabilirsiniz biliyorum:

var hub = GlobalHost.ConnectionManager.GetHubContext<T>(); 
hub.Clients.All.clientSideMethod(param); 

Ama bu istemci tarafında doğrudan yöntemini yürütür.

Sunucu tarafı ClientSideMethod(param) yönteminde iş mantığım varsa, denetleyiciden istemciden arandığında olduğu gibi aramak istiyorum?

Şu anda hub'ımın içinde public static void ClientSideMethod(param) kullanıyorum ve bu yöntemde IHubContext'u ConnectionManager'dan kullanıyorum.

Bunu yapmanın daha iyisi yok mu?

çalışmıyor aşağıdaki (SignalR 2'de artık?): Orada

var hubManager = new DefaultHubManager(GlobalHost.DependencyResolver); 
instance = hubManager.ResolveHub(typeof(T).Name) as T; 
instance.ClientSideMethod(param); 

Bir Müşteriler erişirken istisna, "Hub Hub boru hattı desteklenmez aracılığıyla oluşturulmamış" olsun. Ben

public class MyHub : Hub 
{ 
    public void DoSomething() 
    { 
     var helper = new HubHelper(this); 
     helper.DoStuff("hub stuff"); 
    } 
} 

public class MyController : Controller 
{ 
    public ActionResult Something() 
    { 
     var hub = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
     var helper = new HubHelper(hub); 
     helper.DoStuff("controller stuff"); 
    } 
} 

public class HubHelper 
{ 
    private IHubConnectionContext hub; 

    public HubHelper(IHubConnectionContext hub) 
    { 
     this.hub = hub; 
    } 

    public DoStuff(string param) 
    { 
     //business rules ... 

     hub.Clients.All.clientSideMethod(param); 
    } 
} 
+0

Neden ben JS olduğunu varsayalım müşteri, bunu, sen bir Ajax isteği yapmak ve denetleyici – MEYWD

+1

@MEYWD üzerinde gerekenleri yapabilirsiniz: Aşağıdaki gibi public class AdminHub : Hub<AdminHub>) Ben (statik) yöntemleri: Çünkü örneğin "bir şey olduğunda" güncellemek istediğim bir yönetici arayüzüne sahibim. Örneğin. İstemci belirli bir sayfayı ziyaret ettiğinden, bu sayfadaki denetleyici eyleminde hub yöntemini tetiklemek isterim. Asıl müşteri bunu umursamıyor, o zaman neden bu mesajı iletmeli? – ChrFin

+0

Benzer bir şey yaptım, istemciler ve yöneticilerim var (özel istemci), yönetici bir komut gönderiyor ve istemciden gelen yanıtı bekliyorum, bunu yapmak için yöneticilerin listesini ve merkezdeki istemci listesini yaptım. admin bir istemci seçer, başka bir yönetici kullanmaz, böylece bir komut gönderir, göbek müşteriye aktarır, istemci göbe cevabını döndürür, ki bu da yöneticiye iletilir ve yanıt yazdırılır Ekranda zaten daha iyi bir yaklaşım olduğu için – MEYWD

cevap

11

Ben "iyi bir çözüm" bulamadık gibi:

11

O kudreti eser iş kurallarını uygular ve Hub ve Denetleyici ikisi tarafından çağrılan bir "yardımcı" sınıfı oluşturmak için

Ben şu ana sınıfını yarattı

: bazı iyileştirmeler ile @ michael.rp en çözümünü kullanıyorum

public abstract class Hub<T> : Hub where T : Hub 
{ 
    private static IHubContext hubContext; 
    /// <summary>Gets the hub context.</summary> 
    /// <value>The hub context.</value> 
    public static IHubContext HubContext 
    { 
     get 
     { 
      if (hubContext == null) 
       hubContext = GlobalHost.ConnectionManager.GetHubContext<T>(); 
      return hubContext; 
     } 
    } 
} 

Ve sonra ben n gerçek Hub (ör.

/// <summary>Tells the clients that some item has changed.</summary> 
public async Task ItemHasChangedFromClient() 
{ 
    await ItemHasChangedAsync().ConfigureAwait(false); 
} 
/// <summary>Tells the clients that some item has changed.</summary> 
public static async Task ItemHasChangedAsync() 
{ 
    // my custom logic 
    await HubContext.Clients.All.itemHasChanged(); 
} 
+0

+1 ekranı, ama yine de "daha net" ve "anlaşılması daha kolay" göründüğü gibi "doğrudan" Hub yöntemlerini kullanabilme olasılığını istiyorum. – ChrFin

+0

@ChrFin hub yöntemlerini derleme içinden başarıyla çağırmanın bir yolunu buldunuz mu? Göbeğin bir örneğini çağırmaksızın, bu seçenek en çok DRY ve bölümlendirilmiş olarak görünmektedir. –

+0

@BrandonWittwer: Hayır, gerçekten değil. Cevabını "doğal çözüm" için hala umduğum gibi kabul etmedim. Şu an sahip olduğum çözümle bir cevap ekleyeceğim ... – ChrFin

İlgili konular