2015-11-17 1 views
2

Ceci est pour la bibliothèque CacheManager de Michah Conrad. Dans son exemple, il crée un gestionnaire de cache à l'aide de la méthode CacheFactory.Build, comme on le voit ici:Enregistrement d'ICacheManager générique à l'aide d'un conteneur IoC (Ninject)

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); 
    } 
} 

Ma question, est-il possible d'enregistrer l'interface ICacheManger de sorte que toutes les dépendances de la propriété de tout type seront automatiquement créés par le conteneur IoC?

Dire que j'ai cette classe

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

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

Comment pourrais-je configurer mon noyau Ninject pour lier l'interface générique ICacheManager afin qu'il résout en utilisant les types de MyClass?

Quelque chose comme ça, mais qui fonctionne réellement:

kernel.Bind<ICacheManager<T>>().ToMethod((context) => 
{ 
    return CacheFactory.FromConfiguration<T>("defaultCache"); 
}); 

Répondre

3

a répondu à ma propre question. Voici comment vous le faites:

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

Modifier 20/11/2015:

Comme Micha a souligné, nous devons utiliser InSingletonScope à la fin pour le forcer à garder l'instance qu'il crée tout au long de la durée de vie de l'application. La raison en est que chaque instance de CacheManager possède son propre cache car les clés sont précédées de l'identifiant unique de l'occurrence CacheManager. Ainsi, même si vous utilisez un cache partagé comme System.Runtime.Caching.MemoryCache, CacheManager en crée de nouvelles.

+1

ne pas oublier d'utiliser singleton;) Sinon, Ninject crée une nouvelle instance de cache chaque fois que vous instanciez MyClass. .InSingletonScope() devrait fonctionner – MichaC