2010-07-05 35 views
7

Bu biraz garip gelebilir, ancak C# 'de çok karmaşık çift yönlü iletişim için özellikle de diğer geliştiricilerin DRY ilkesini gözlemlemeye zorlamak için bir çözüm oluşturmam gerekiyor. - Şimdiye kadarC#: "self" türünü jenerik parametre olarak mı kullanıyorsunuz?

internal sealed class SessionManager<T> where T : DuplexServiceBase 

hiç sorun değildir:

Yani ne yapıyorum şöyle bir tür dayalı multiton sahip olmaktır.

Ancak, en kısa sürede (ben oturumda başına tek bir örnek ile gidiyorum) SessionManager kendilerini kayıt hizmetlerini yapmak istediğiniz kadar güçlük başlar:

internal abstract class DuplexServiceBase : MessageDispatcherBase<Action> 

(MessageDispatcherBase benim bir sınıf olma Bu bir iş parçacığı oluşturur ve eşzamansız iletileri gönderir). nasıl "öz" için alacağı -

protected void ProcessInboundMessage() 
    { 
     // Connect 
     SessionManager<self>.Current.Connect(this); 
    } 

... ama sorun:

ben şöyle bir yöntem var mı istiyorsunuz?

Her hizmet sınıfı için gerçekten ayrı oturum yöneticilerine İHTİYACIM; çünkü bunların hepsinin kendi bildirimleri vardır (temelde son derece rahatsız edici "NotifyAllClients" - son saatlerde kendi saçımı çekmemizi sağlayan yöntem) ve gereksinim ayrı ayrı tedavi edilmelidir.

Herhangi bir fikrin var mı?

"AsyncPattern = true", btw ... kullanmak istemiyorum, bu tip güvenlik, zorlanan sözleşme uyumluluktan vazgeçmemi gerektirecektir (bu, ayarlı olduğum iletişim sisteminin kötüye kullanılmasına neden olur burada) ve DRY'yi terk etmeyi gerektirir - ilke, her yerde çok fazla yinelenen kod olurdu ve bu ciddi olarak kaşlarını çattığım bir şey.

Düzenleme: Burada cevaplara sayesinde mümkün olan en iyi çözümü bulduk

- bu hehe, bir UZATMA YÖNTEMİ var ...

public static SessionManager<T> GetSessionManager<T>(this T sessionObject) 
     where T : DuplexServiceBase 
    { 
     return SessionManager<T>.Current; 
    } 

böyle bu kullanabilirsiniz:

GetSessionManager().Connect(this); 

Görev tamamlandı. : -D

Bu yöntem (DuplexServiceBase'e aittir) ile birlikte çalışmak istediğim oturum yöneticisini verir. Mükemmel! :-)

cevap

15

Bir yardımcı yöntemini yazmak istiyorum:

static class SessionManager { // non-generic! 
    static void Connect<T>(T item) where T : DuplexServiceBase { 
     SessionManager<T>.Current.Connect(item); 
    } 
} 

ve otomatik genel tür çıkarsama yoluyla anlamaya olacak SessionManager.Connect(this) kullanın.

+0

sen bir dahisin, sana +100 verecekti. Çok teşekkür ederim sooooooo !! –

+0

Şüphesiz SessionManager .Current.Connect (item); '? –

+0

Hehe, tabiki "bu" ile "bu" değiştirmeliydim. :-) –

3

Sen böylelikle derleyici'nın tür kesmesi yararlanarak, genel bir yöntemde çağrıyı sarabilirdiniz: Ben OLDUĞUNU cevap gelse

private static void ConnectSessionManager<T>(T service) 
{ 
    SessionManager<T>.Current.Connect(service) 
} 

protected void ProcessInboundMessage() 
{ 
    // Connect 
    ConnectSessionManager(this); 
} 
İlgili konular