c# - 使用 IoC 容器 (Ninject) 注册通用 ICacheManager

标签 c# ninject cachemanager

这是给CacheManager的米查·康拉德 (Michah Conrad) 的图书馆。在他的示例中,他使用 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 接口(interface),以便 IoC 容器自动创建任何类型的任何属性依赖项?

假设我有这门课

public class MyClass
{
    [Inject]
    public ICacheManager<string> StringCacheManager { get; set; }

    [Inject]
    public ICacheManager<int> IntCacheManager { get; set; }
}

如何设置 Ninject 内核来绑定(bind)通用 ICacheManager 接口(interface),以便它使用 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 也会创建它的新实例。

关于c# - 使用 IoC 容器 (Ninject) 注册通用 ICacheManager,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33762917/

相关文章:

caching - CacheManager.Net - Redis 流水线

c# - 我无法写入配置文件

C# WinForm 内存泄漏

c# - 使用 LINQ 表达式的文本表示

ninject - SignalR 依赖解析器无法在 Javascript 中心工作

c# - 无锁多线程适合真正的线程专家

nhibernate - 在存储库层中使用 Fluent NHibernate 进行注入(inject)

ios - 如何清除iOS中的缓存?

c# - 如何使用 CacheManager 设置 Redis 服务器池大小?