Revision: 49571
Initial Code
Initial URL
Initial Description
Initial Title
Initial Tags
Initial Language
at July 25, 2011 15:28 by stewartrae
Initial Code
/// <summary>
/// A lazy loader - loads an object into the instance variable on demand.
/// Always returns the same instance once loaded.
/// Thread safe.
/// </summary>
/// <typeparam name="T">The instance type</typeparam>
public class LazyLoader<T> where T : class
{
private static object _padlock = new object();
private T _instance;
private Func<T> _loader;
/// <summary>
/// Constructor.
/// </summary>
/// <param name="loader">The function to load/instantiate the instance</param>
public LazyLoader(Func<T> loader)
{
if (loader == null)
{
throw new ArgumentNullException("loader");
}
_loader = loader;
}
/// <summary>
/// Returns the loaded instance.
/// </summary>
public T Instance
{
get
{
EnsureLoad();
return _instance;
}
}
/// <summary>
/// Ensures that the instance is loaded.
/// </summary>
public void EnsureLoad()
{
// Use double-checked locking pattern when lazy-loading the data.
if (_instance == null)
{
lock (_padlock)
{
if (_instance == null)
{
_instance = _loader();
}
}
}
}
Initial URL
Initial Description
A simple, thread-safe wrapper class for lazy-loading data into an instance on-demand (i.e. when the instance is first accessed.)
Usage:
LazyLoader<Foo> l = new LazyLoader<Foo>(() => Foo.LoadFromDataSource("DB Connection String"));
// For access to the lazy-loaded instance:
var x = l.Instance.Bar;
// Need to ensure that the data is loaded deterministically? Use this:
l.EnsureLoad();
Initial Title
LazyLoader - a simple, thread-safe class that can be used to load data on demand.
Initial Tags
load
Initial Language
C#