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

时间:2015-11-17 17:06:05

标签: c# ninject cachemanager

这是Michah 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");
});

1 个答案:

答案 0 :(得分:3)

回答了我自己的问题。你就是这样做的:

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也会创建它的新实例。