Search code examples
c#asp.net-mvcunity-container

Accessing unity container of web app from a class library


I have a class library for caching ( Redis ), we have a unity container inside this Redis class library

public class TCache<T>
{
    static readonly IUnityContainer container = new UnityContainer();

    private ITCache<T> ICacheStore;
    static TCache()
    {
        container.RegisterType<ITCache<T>, TRedisCacheStore<T>>(new ContainerControlledLifetimeManager());
    }
    public TCache()
    {
        ICacheStore = container.Resolve<TRedisCacheStore<T>>();
    }

Now my senior said me not use a separate container like this and I should be using the container which is already created inside the web app with the reason being that there should be only one single container.

My question is: is it possible to access a unity container that resides in a different project and is it necessary to do this change ?

Note: I cannot add the reference of the web app into the Redis cache class library.


Solution

  • You should only reference a container within your composition root (http://blog.ploeh.dk/2011/07/28/CompositionRoot/).

    In other words, find where your current services are registered, and perform the generic registration there.

    Your type that requires a cache store then takes your abstraction via constructor injection:

    public class Cache<T>
    {
      private readonly ITCache<T> cacheStore;
    
      public Cache(ITCache<T> cacheStore)
      {
          this.cacheStore = cacheStore 
              ?? throw new ArgumentNullException(nameof(cacheStore));
      }
    }
    

    By the way, using T as a prefix for your types (rather than as a prefix for generic type parameters) is very confusing.

    The names TCache and ITCache are also very confusing.