Cati dintre voi ati folosit pana acuma KeyedByTypeCollection? Sa va spun sincer, pana nu de mult nici nu stiam ca exista. Aceasta colectie este un dictionar unde cheile acesteia sunt reprezentate de tipul valorii adaugate in colectie.
La ce este folositoare?Un scenariu in care aceasta colectie poate sa foarte folositoare este cand vrem sa avem un factory care sa pastreze obiectele ca si singleton. Folosind aceasta colectie implementarea factory poate sa aibe urmatoarea forma:
Enjoy!
KeyedByTypeCollection<object> collection = new KeyedByTypeCollection<object>();
collection.Add("Car");
collection.Add(1);
collection.Add(1.1);
collection.Add("Dog"); // Aceasta linie o sa arunce exceptie.
Ultima linie o sa arunce exceptie deoarece avem deja in colectie un element de tip string. La prima vedere aceasta colectie pare destul de ciudata si poate genera urmatoarea intrebare:La ce este folositoare?Un scenariu in care aceasta colectie poate sa foarte folositoare este cand vrem sa avem un factory care sa pastreze obiectele ca si singleton. Folosind aceasta colectie implementarea factory poate sa aibe urmatoarea forma:
public class SingletonFactory<T>
{
private readonly KeyedByTypeCollection<T> _items = new KeyedByTypeCollections<T>();
public TItem GetObject<TItem>()
where TItem : T, new()
{
if(!_items.Contains(typeof(TItem))
{
_items.Add(new TItem));
}
return (TItem)_items[typeof(TItem)];
}
}
In ce alte scenarii de utilizare ati folosii aceasta colectie?Enjoy!
Pai cam in acelasi fel in care o utilizeaza si WCF, prin BindingParametersCollection: sa se asigure ca primeste o colectie de extensii/pluginuri/decorators/whatever de tipuri diferite (fara duplicate), deci tot un fel de sigletons in acel context...
ReplyDeleteRadu, would you please be more attentive cu privire la spelling? Prea des văd pe blogul tău, ca în postarea de față, „cheiile” sau „folosii”. Și mai sunt o groază de alte scăpări. Thanks.
ReplyDelete