使用IoC容器(Ninject)注册通用ICacheManager
本文关键字:注册 ICacheManager Ninject IoC 容器 使用 | 更新日期: 2023-09-27 18:22:13
这是Michh Conrad为CacheManager库编写的。在他的例子中,他使用CacheFactory.Build方法创建了一个缓存管理器,如下所示:
public class WebApiApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
GlobalConfiguration.Configure(WebApiConfig.Register);
var container = new UnityContainer();
GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
var cache = CacheFactory.Build("todos", settings =>
{
settings
.WithSystemRuntimeCacheHandle("inprocess");
});
container.RegisterInstance(cache);
}
}
我的问题是,是否可以注册ICacheManger接口,以便IoC容器自动创建任何类型的属性依赖项?
假设我有这类
public class MyClass
{
[Inject]
public ICacheManager<string> StringCacheManager { get; set; }
[Inject]
public ICacheManager<int> IntCacheManager { get; set; }
}
我如何设置我的Ninject内核来绑定通用ICacheManager接口,以便它使用MyClass中的类型进行解析?
类似这样的东西,但实际上有效:
kernel.Bind<ICacheManager<T>>().ToMethod((context) =>
{
return CacheFactory.FromConfiguration<T>("defaultCache");
});
回答了我自己的问题。这就是你的做法:
kernel.Bind(typeof(ICacheManager<>)).ToMethod((context) =>
{
// GenericArguments holds the actual type for ICacheValue used in the ICachManager property or argument
return CacheFactory.FromConfiguration(context.GenericArguments[0], "defaultCache");
});
编辑2015-11-20:
正如Micha所指出的,我们必须在最后使用InSingletonScope来强制它在应用程序的整个生命周期中保留它创建的实例。原因是CacheManager的每个实例都有自己的缓存,因为键的前缀是CacheManager实例的唯一id。因此,即使您使用像System.Runtime.Caching.MemoryCache这样的共享缓存,CacheManager也会创建它的新实例。