我有一个用于缓存的类库(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缓存类库中。
答案 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
作为类型的前缀(而不是作为泛型类型参数的前缀)是非常令人困惑的。
名称TCache
和ITCache
也非常令人困惑。