从 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
作为您的类型的前缀(而不是作为泛型类型参数的前缀)非常令人困惑。
名字TCache
和ITCache
也很混乱。
我有一个 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
作为您的类型的前缀(而不是作为泛型类型参数的前缀)非常令人困惑。
名字TCache
和ITCache
也很混乱。