Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用IoC容器(Ninject)注册通用ICacheManager_C#_Ninject_Cachemanager - Fatal编程技术网

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

C# 使用IoC容器(Ninject)注册通用ICacheManager,c#,ninject,cachemanager,C#,Ninject,Cachemanager,这是Michah Conrad为图书馆写的。在他的示例中,他使用CacheFactory.Build方法创建了一个缓存管理器,如下所示: public class WebApiApplication : System.Web.HttpApplication { protected void Application_Start() { GlobalConfiguration.Configure(WebApiConfig.Register); var

这是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接口,以便IoC容器自动创建任何类型的属性依赖项

假设我有这门课

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

    [Inject]
    public ICacheManager<int> IntCacheManager { get; set; }
}
公共类MyClass
{
[注入]
公共ICacheManager StringCacheManager{get;set;}
[注入]
公共ICacheManager IntCacheManager{get;set;}
}
我如何设置我的Ninject内核来绑定泛型ICAChemManager接口,以便它使用MyClass中的类型进行解析

类似这样,但实际上是可行的:

kernel.Bind<ICacheManager<T>>().ToMethod((context) =>
{
    return CacheFactory.FromConfiguration<T>("defaultCache");
});
kernel.Bind().ToMethod((上下文)=>
{
返回CacheFactory.FromConfiguration(“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");
});
kernel.Bind(typeof(ICacheManager)).ToMethod((context)=>
{
//GenericArguments保存在ICachManager属性或参数中使用的ICacheValue的实际类型
返回CacheFactory.FromConfiguration(context.genericalarguments[0],“defaultCache”);
});
编辑2015-11-20:


正如Micha指出的,我们必须在最后使用InSingletonScope来强制它在应用程序的整个生命周期中保留它创建的实例。这是因为CacheManager的每个实例都有自己的缓存,因为键的前缀是CacheManager实例的唯一id。因此,即使您使用诸如System.Runtime.Caching.MemoryCache之类的共享缓存,CacheManager也会创建它的新实例。

别忘了使用singleton;)否则,每次实例化MyClass时,Ninject都会创建一个新的缓存实例。InSingletonScope()应该可以工作