2008-12-01 8 views
9

Mientras revisaba la colección genérica en .net, encontré KeyedByTypeCollection. Aunque trabajé con él y llegué a saber cómo usarlo, no entendí en qué escenario sería útil.Usos de KeyedByTypeCollection en .Net?

Leí en ServiceProvider, cache etc. done with generics without cast, pero no pude conseguir mucho.

Creo que debe haber una razón de por qué se ha incluido en .Net Framework. Cualquier organismo que haya usado KeyedByTypeCollection puede explicarme por qué lo usaron o cualquier otro cuerpo, si saben en qué escenario se puede usar, pueden explicarlo.

Como curiosidad, ¿algún otro idioma admite este tipo de colección?

Respuesta

13

AFAIK, esta colección genérica sirve como una simple envoltura para KeyedCollection<KEY,VALUE> cuando KEY es el tipo de VALUE que se va a almacenar.

Por ejemplo, es muy conveniente utilizar esta colección si se desea implementar una fábrica únicos que regresan:

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)]; 
    } 
} 

El uso de este simple fábrica sería algo como lo siguiente:

[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); 
    } 

Otro uso para KeyedByTypeCollection<T> sería dentro de un localizador de servicios ...

+1

Gracias, por el buen uso que ha proporcionado aquí. – Biswanath

+0

¿Por qué una fábrica quiere devolver singletons? –

3

la "fábrica Singleton" es un enfoque diferente a la probl em de singletons

Hay tres enfoques principales:

  1. implementar un Current o Instance propiedad en todas las clases - Se refiere a una gran cantidad de código repetido. Cual es malo.

  2. Implemente una clase base Singleton<T> - significa que puede tener class A : Singleton<B> que es claramente incorrecto.

  3. Implemente un SingletonFactory - esto está bien documentado. Lo pensé hace aproximadamente 12 meses y me sorprendió francamente encontrar que es un tema muy bien cubierto en el mundo de Java. El que he escrito para mi cliente actual no tiene restricciones de interfaz, y es estático, lo que significa que tiene un bloqueo alrededor de la colección para seguridad de subprocesos. Sin hacerlo estático, corre el riesgo de obtener dos singletons del mismo tipo que sean objetos diferentes.