簡體   English   中英

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

[英]Register generic ICacheManager using an IoC container (Ninject)

這是針對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");
});

回答了我自己的問題。 這是您的操作方式:

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也會為其創建新實例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM