从类库中访问Web应用程序的统一容器

时间:2018-06-14 09:48:23

标签: c# asp.net-mvc unity-container

我有一个用于缓存的类库(Redis),我们在这个Redis类库中有一个统一容器

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>>();
    }

现在我的大四学生说我不使用这样的单独容器,我应该使用已经在Web应用程序中创建的容器,原因是应该只有一个容器。

我的问题是:是否可以访问驻留在不同项目中的统一容器,是否有必要进行此更改?

注意:我无法将Web应用程序的引用添加到Redis缓存类库中。

2 个答案:

答案 0 :(得分:0)

好吧,我分享他对容器用法的看法。我如何解决这个问题(没有详细介绍我实际创建它的方式):

选择通过界面注册到容器。类似于IRegisterContainer.Register(IUnityContainer容器)。

然后,在您现在将映射注册到容器的那一刻,您可以扩展该函数,以便在程序集中搜索实现该IRegisterContainer的所有对象,并使它们自己注册。

并将此作为解决问题的平台。

如果要在TCache对象中使用IUnityContainer来解析TRediscacheStore。只需让IUnityContainer注册即可。

container.Register<IUnityContainer, container>(). 

并使其成为TCache构造函数中的依赖项。

答案 1 :(得分:0)

您应该只引用合成根http://blog.ploeh.dk/2011/07/28/CompositionRoot/)中的容器。

换句话说,找到您当前服务的注册位置,并在那里执行通用注册。

您需要缓存存储的类型然后通过构造函数注入获取您的抽象:

public class Cache<T>
{
  private readonly ITCache<T> cacheStore;

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

顺便说一下,使用T作为类型的前缀(而不是作为泛型类型参数的前缀)是非常令人困惑的。

名称TCacheITCache也非常令人困惑。