我为我的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中的位置/如何实例化对象以从所有控制器获取全局访问权限?
答案 0 :(得分:1)
我看不出问题!!
您所要做的就是将(static)关键字添加到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();
}