0

我为我的 MVC 应用程序创建了一个自定义缓存提供程序。我将使用此类将会话数据存储/检索到外部服务(如 memcached 或 Redis)。

我想在应用程序启动时创建一次对象实例,以便我可以从任何控制器引用该对象,并且只需“新建”一次实例。我在想我会在 Global.asax Application_Start 方法中实例化该类。但是,该实例似乎无法在任何控制器中访问。

在 MVC 中实例化然后访问(全局)类的首选方法是什么?

这是我的“简化”课程的副本:

 public class PersistentSession : IPersistentSession
    {
        // prepare Dependency Injection
        public ICache cacheProvider { get; set; }

        public bool SetSessionValue(string key, string value)
        {
            return cacheProvider.PutToCache(key, value);
        }

        public bool SetSessionValue(string key, string value, TimeSpan expirationTimeSpan)
        {
            return cacheProvider.PutToCache(key, value, expirationTimeSpan);
        }

        public string FetchSessionValue(string key)
        {
            return cacheProvider.FetchFromCache(key);
        }
    }

我想实例化一次,以便我可以从所有控制器应用程序范围内访问它,如下所示:

 // setup PersistentSession object
 persistentSession = new PersistentSession();
 string memcachedAddress = WebConfigurationManager.AppSettings["MemcachedAddress"].ToString();
 string memcachedPort = WebConfigurationManager.AppSettings["MemcachedPort"].ToString();

 persistentSession.cacheProvider = new CacheProcessor.Memcached(memcachedAddress, memcachedPort);

应该在 MVC 中的何处/如何实例化对象以从所有控制器获取全局访问权限?

4

1 回答 1

1

看不出问题!!

您所要做的就是在 PersistentSession 类的方法定义中添加(静态)关键字:

public class PersistentSession : IPersistentSession
{
    // prepare Dependency Injection
    public static ICache cacheProvider { get; set; }

    public static bool SetSessionValue(string key, string value)
    {
        return cacheProvider.PutToCache(key, value);
    }

    public static bool SetSessionValue(string key, string value, TimeSpan expirationTimeSpan)
    {
        return cacheProvider.PutToCache(key, value, expirationTimeSpan);
    }

    public static string FetchSessionValue(string key)
    {
        return cacheProvider.FetchFromCache(key);
    }
}

. 您可以在任何地方使用以下代码访问它们:

PersistentSession.SetSessionValue (key , value);

您还可以添加一个静态构造函数来在访问任何成员之前初始化任何字段,并且在第一次访问静态类的成员之前调用该构造函数,因此您可以确保在使用之前设置您的类。

public static PersistentSession ()
{
//Put your initializing code, for example:
cacheProvider = new CacheProvider();
}
于 2012-10-23T05:08:28.453 回答