2008-12-01 22 views
9

. Net koleksiyonuna göz atarken, KeyedByTypeCollection ile ilgili bilgileri buldum. Bununla birlikte çalışıp onu nasıl kullanacağımı bilmeme rağmen, hangi senaryonun faydalı olacağını anlamamıştım..Net'de KeyedByTypeCollection Kullanımı?

ServiceProvider, cache etc. done with generics without cast aracılığıyla okurum, ancak çok fazla şey alamadım.

Sanırım .Net çerçevesine neden dahil edildiğine dair bir neden olmalı. KeyedByTypeCollection'ı kullanan herhangi bir kişi bana, onu neden veya herhangi bir vücut kullandığını açıklayabilir, eğer potansiyel olarak hangi senaryoda kullanılabileceğini biliyorsanız, bunu bana açıklayabilir.

Başka bir dil, bu tür bir koleksiyonu desteklediğinden daha fazla merak var mı?

cevap

13

AFAIK, bu genel koleksiyon, KEYVALUE'un ne zaman depolandığı KeyedCollection<KEY,VALUE> için basit bir sarıcı görevi görür.

[Test] 
    public void Returns_Singletons() 
    { 
     Factory<ICar> factory = new Factory<ICar>(); 
     Opel opel1 = factory.GetSingleton<Opel>(); 
     Opel opel2 = factory.GetSingleton<Opel>(); 

     Assert.IsNotNull(opel1); 
     Assert.IsNotNull(opel2); 
     Assert.AreEqual(opel1, opel2); 
    } 
:

public class Factory<T> 
{ 
    private readonly KeyedByTypeCollection<T> _singletons = new KeyedByTypeCollection<T>(); 

    public V GetSingleton<V>() where V : T, new() 
    { 
     if (!_singletons.Contains(typeof(V))) 
     { 
      _singletons.Add(new V()); 
     } 
     return (V)_singletons[typeof(V)]; 
    } 
} 

bu basit fabrikanın kullanımı aşağıdaki gibi bir şey olacaktır: Örneğin

, bir fabrika dönen singletons uygulamak istiyorsanız bu koleksiyon kullanımı çok rahat olan

KeyedByTypeCollection<T> için başka bir kullanım, bir hizmet bulucunun içinde olacaktır.

+1

Teşekkürler, burada sağladığınız güzel kullanım için. – Biswanath

+0

Bir fabrika neden tekil vermek ister? –

3

"Singleton fabrikası", soruna farklı bir yaklaşımdır. singletonların emirleri. - tekrarlanan kod çok şey ifade

  1. her sınıfta bir Current veya Instance özelliğini Uygulanışı:

    üç ana yaklaşım vardır. Hangi kötü.

  2. Singleton<T> taban sınıfını uygulayın - class A : Singleton<B>'un açıkça yanlış olduğu anlamına gelir.

  3. SingletonFactory uygulayın - bu iyi belgelenmiştir. Yaklaşık 12 ay önce düşündüm ve Java dünyasında çok iyi ele alınmış bir konu olduğunu açıkçası şaşırdım. Mevcut müşterim için yazdığımın hiçbir arabirim kısıtlaması yoktur ve statiktir, yani iplik güvenliği için koleksiyonun etrafında bir kilit vardır. Statik yapmadan, farklı nesneler olan aynı türden iki tane tekli almayı riske atmış olursunuz.