Lazy Loading
Lazy loading is a concept where we delay the loading of the object
until the point where we need it. Putting in simple words, on demand
object loading rather than loading
objects unnecessarily.
For example, consider the below example where we have a simple
But how about just loading the
Create the object of orders using the
You will get the
But the advantages are far more than the disadvantages.
For example, consider the below example where we have a simple
Customer class and this
Customer class has many Order objects inside it. Have a close look
at the constructor of the Customer class. When the Customer object is created it also loads the
Order object at that moment. So even if we need or do not need
the Order object, it’s still loaded.But how about just loading the
Customer object initially and then on demand basis load the
Order object?
Hide Copy Code
public class Customer
{
private List<Order> _Orders= null;
…
…
public Customer()
{
_CustomerName = "Shiv";
_Orders = LoadOrders(); // Loads the order object even though //not needed
}
private List<Order> LoadOrders()
{
List<Order> temp = new List<Order>();
Order o = new Order();
o.OrderNumber = "ord1001";
temp.Add(o);
o = new Order();
o.OrderNumber = "ord1002";
temp.Add(o);
return temp;
}
}
So let’s consider you have client code which consumes the Customer class as shown below. So when the
Customer object is created no Order objects should be
loaded at that moment. But as soon as the foreach loop runs you would like to load the
Order object at that point (on demand object loading).
Hide Copy Code
Customer o = new Customer(); // order object not loaded
Console.WriteLine(o.CustomerName);
foreach (Order o1 in o.Orders) // Load order object only at this moment
{
Console.WriteLine(o1.OrderNumber);
}
So how do we implement lazy loading?
For the above example if we want to implement lazy loading we will need to make the following changes:- Remove the
Orderobject loading from the constructor. - In the
Orderget property, load theOrderobject only if it’s not loaded.
Hide Copy Code
public class Customer
{
private List<Order> _Orders= null;
…
…
public Customer()
{
_CustomerName = "Shiv";
}
public List<Order> Orders
{
get
{
if (_Orders == null)
{
_Orders = LoadOrders();
}
return _Orders;
}
}
Now if you run the client code and halt your debugger just before the foreach
loop runs over the Orders object, you can see the Orders object is
null (i.e., not loaded).
But as soon as the foreach loop runs over the Order
object it creates the Order object collection.Are there any readymade objects in .NET by which we can implement lazy loading?
In .NET we have theLazy<T> class which provides automatic support for lazy loading. So let’s say if you want to implement
Lazy<> in the above code, we need
to implement two steps:Create the object of orders using the
Lazy generic class.
Hide Copy Code
private Lazy<List<Order>> _Orders= null;
Attach this Lazy<> object with the method which will help us load the order’s data.
Hide Copy Code
_Orders = new Lazy<List<Order>>(() => LoadOrders());
Now as soon as any client makes a call to the _Orders object, it will call the
LoadOrders function to load the data.You will get the
List<orders> data in the Value property.
Hide Copy Code
public List<Order> Orders
{
get
{
return _Orders.Value;
}
}
Below goes the full code for this:
Hide Copy Code
public class Customer
{
private Lazy<List<Order>> _Orders= null;
public List<Order> Orders
{
get
{
return _Orders.Value;
}
}
public Customer()
{
// Makes a database trip
_CustomerName = "Shiv";
_Orders = new Lazy<List<Order>>(() => LoadOrders());
}
}
What are the advantages and disadvantages of lazy loading?
Below are the advantages of lazy loading:- Minimizes start up time of the application.
- Application consumes less memory because of on-demand loading.
- Unnecessary database SQL execution is avoided.
But the advantages are far more than the disadvantages.
Comments
Post a Comment