There is a good description of this generic WeakReference<> class here.
Here is an example of using WeakReferences for caching XslCompiledTransform's:
Here is an example of using WeakReferences for caching XslCompiledTransform's:
private static Dictionary<string, WeakReference<XslCompiledTransform>> xsltLookupTable =
new Dictionary<string, WeakReference<XslCompiledTransform>>();
public XslCompiledTransform GetCompiledTransform(string xslFileName)
{
XslCompiledTransform xct = null;
bool found = xsltLookupTable.ContainsKey(xslFileName);
if (found) // IF the transform is already cached
{ // Try and get it
WeakReference<XslCompiledTransform> xctWr = xsltLookupTable[xslFileName]
as WeakReference<XslCompiledTransform>;
xctWr.TryGetTarget(out xct); // Try and get it from the WeakReference
m_logger.WriteTrace("Found XslCompiledTransform entry for \'" +
xslFileName + "\' in the cache");
// Note the entry maybe null (if the weak reference expired)
}
if (xct == null) // IF the compiled transform was not already cached
{
// Create it
xct = new XslCompiledTransform();
xct.Load(xslFileName,
new XsltSettings { EnableDocumentFunction = true },
new XmlUrlResolver());
// Insert it into a WeakReference
WeakReference<XslCompiledTransform> wr = new
WeakReference<XslCompiledTransform>(xct);
if (found)
{
m_logger.WriteTrace("Removing XslCompiledTransform entry for \'" +
xslFileName + "\' as it was null in the cache");
xsltLookupTable.Remove(xslFileName);
}
xsltLookupTable.Add(xslFileName, wr); // Add the WeakReference to the cache
m_logger.WriteTrace("Adding XslCompiledTransform entry for \'" +
xslFileName + "\'");
}
return xct;
}
It uses the new generic WeakReference<> class (available in .NET 4.5?).
This class could be further refactored into a generic caching class if it was required.