繁体   English   中英

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

[英]Accessing unity container of web app from a class library

我有一个用于缓存的类库(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缓存类库中。

好吧,我同意他对容器使用的看法。 我如何解决此问题(无需深入了解如何实际创建此问题):

选择一个通过接口注册到容器的选项。 类似于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的名称也非常令人困惑。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM