Skip to content

缓存工厂

Catcher Wong edited this page Oct 6, 2019 · 1 revision

为什么我们需要缓存工厂?

在EasyCaching中,所有不同类型的provider都是通过下面三个接口来进行操作的。

  • IEasyCachingProvider
  • IRedisCachingProvider
  • IHybridCachingProvider

缓存工厂最主要的目的是解决多实例的问题。多实例可以理解成,在一个项目中,用到了多个不同的provider,如,一个InMemory一个CSRedis,三个InMemory,两个InMemory两个CSRedis 等。

缓存工厂的实现

目前EasyCaching提供了两个工厂去创建这三类provider

  • IEasyCachingProviderFactory (可以创建IEasyCachingProvider和IRedisCachingProvider)
  • IHybridProviderFactory (可以创建IHybridCachingProvider,v0.8.0版本之后)

工厂创建对应的provider都是通过名字来区分的,并且这个名字必须是唯一的!

名字是在注册到容器的时候指定的。

services.AddEasyCaching(option =>
{
    // 添加一个名为m1的caching provider
    option.UseInMemory("m1");

    // 添加一个名为m2的caching provider
    option.UseInMemory("m2");

    // 添加一个名为redis1的caching provider和一个名为redis1的redis provider
    option.UseRedis(config =>
    {
        config.DBConfig.Endpoints.Add(new ServerEndPoint("127.0.0.1", 6379));
    }, "redis1");

    // 添加一个名为redis2的caching provider和一个名为redis2的redis provider
     option.UseRedis(config =>
     {
         config.DBConfig.Endpoints.Add(new ServerEndPoint("127.0.0.1", 6380));
     }, "redis2");     

     // 添加一个名为h1的hybrid provider
     option.UseHybrid(config =>
     {
         config.EnableLogging = false;
         config.TopicName = "test_topic1";
         config.LocalCacheProviderName = "m1";
         config.DistributedCacheProviderName = "redis1";
      }, "h1");

      // 添加一个名为h2的hybrid provider
      option.UseHybrid(config =>
      {
          config.EnableLogging = false;
          config.TopicName = "test_topic2";
          config.LocalCacheProviderName = "m2";
          config.DistributedCacheProviderName = "redis2";
      }, "h2");         
});

缓存工厂的使用

public class FactoryController : Controller
{
    private readonly IEasyCachingProvider _provider1;
    private readonly IRedisCachingProvider _redis1;
    private readonly IHybridCachingProvider _hybrid1;

    public FactoryController(
        IEasyCachingProviderFactory cFactory
        , IHybridProviderFactory hFactory
    )
    {
        this._provider1 = cFactory.GetCachingProvider("p1");
        this._redis1 = cFactory.GetRedisProvider("r1");
        this._hybrid1 = hFactory.GetHybridCachingProvider("h1");
    }

    // ...
}