Search code examples
cachingdesign-patternsproxyinversion-of-control

Proxy design pattern with IoC


I am trying to implement proxy design pattern for caching services as below.

public interface IProductService
{
   int ProcessOrder(int orderId);
}

public class ProductService : IProductService
{
   public int ProcessOrder(int orderId)
   {
      // implementation
   }
}

public class CachedProductService : IProductService
{
   private IProductService _realService;

   public CachedProductService(IProductService realService)
   {
      _realService = realService;
   }

   public int ProcessOrder(int orderId)
   {
      if (exists-in-cache)
         return from cache
      else
         return _realService.ProcessOrder(orderId);
   }
}

How do I to use IoC container (Unity/Autofac) to create real service and cached service objects as I can register IProductService to ProductService or CachedProductService but CachedProductService in turn requires a IProductService object (ProductService) during creation.

I am trying to arrive at something like this:

The application will target IProductService and request IoC container for an instance and depending on the configuration of the application (if cache is enabled/disabled), the application will be provided with ProductService or CachedProductService instance.

Any ideas? Thanks.


Solution

  • Without a container your graph would look like this:

    new CachedProductService(
        new ProductService());
    

    Here's an example using Simple Injector:

    container.Register<IProductService, ProductService>();
    
    // Add caching conditionally based on a config switch
    if (ConfigurationManager.AppSettings["usecaching"] == "true")
        container.RegisterDecorator<IProductService, CachedProductService>();