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

Accessing unity container of web app from a class library

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

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 应用程序的引用添加到 Redis 缓存 class 库中。

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

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

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

并以此为平台解决您的问题。

如果你想在你的TCache对象中使用IUnityContainer来解析TRediscacheStore。只需让 IUnityContainer 自行注册即可。

container.Register<IUnityContainer, container>(). 

并在 TCache 的构造函数中将其作为依赖。

您应该只在您的组合根目录 (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也很混乱。