C# 从类库访问web应用的unity容器

C# 从类库访问web应用的unity容器,c#,asp.net-mvc,unity-container,C#,Asp.net Mvc,Unity Container,我有一个用于缓存的类库(Redis),我们在这个Redis类库中有一个unity容器 public class TCache<T> { static readonly IUnityContainer container = new UnityContainer(); private ITCache<T> ICacheStore; static TCache() { container.RegisterType<ITC

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

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>>();
    }
公共类TCache
{
静态只读IUnityContainer容器=新的UnityContainer();
切斯托私人酒店;
静态TCache()
{
RegisterType(新的ContainerControlledLifetimeManager());
}
公共TCache()
{
ICacheStore=container.Resolve();
}
现在,我的上级说我不要使用这样一个单独的容器,我应该使用已经在web应用程序中创建的容器,原因是应该只有一个容器

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


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

好吧,我同意他对容器使用的看法。我是如何解决这个问题的(没有详细说明我是如何创建它的):

创建一个通过接口注册到容器的选项。类似于IRegisterContainer.register(IUnityContainer容器)

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

并将其用作解决问题的平台

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

container.Register<IUnityContainer, container>(). 
container.Register()。

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

您应该只引用组合根目录中的容器

换句话说,找到当前服务的注册位置,并在那里执行一般注册

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

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

  public Cache(ITCache<T> cacheStore)
  {
      this.cacheStore = cacheStore 
          ?? throw new ArgumentNullException(nameof(cacheStore));
  }
}
公共类缓存
{
私有只读ITCache缓存存储;
公共缓存(ITCache缓存存储)
{
this.cacheStore=cacheStore
?抛出新的ArgumentNullException(nameof(cacheStore));
}
}
顺便说一下,使用
T
作为类型的前缀(而不是泛型类型参数的前缀)非常容易混淆


名称
TCache
ITCache
也很混乱。

第二个听起来像是一个解决方案让我试试,你能告诉我使用这个的含义吗。哈哈,我不知道。我从来没有想过在一个容器中注册多个容器。我的意思是为什么不。它实际上使作用域容器rs但我并不认为这与仅仅拥有一个容器相比有什么好处。因为在解析容器时,还必须给出主容器,然后用名称进行解析。我认为这只会使控制反转的实现更加复杂,而不是将其简化为最可行的条件。谢谢让我试试这个。我想我从这个链接中得到了答案。我试图引用组合根以外的容器,该链接说“只有应用程序应该有组合根。库和框架不应该有组合根。”谢谢@devdigital