在 asp.net core 中使用類似 Application 的服務(wù)
Intro
在 asp.net 中碎税,我們可以借助 Application
來保存一些服務(wù)器端全局變量胧沫,比如說服務(wù)器端同時(shí)在線的人數(shù)計(jì)數(shù)漾月,比如一些網(wǎng)站的配置信息双霍。
在 ASP.NET 應(yīng)用中臭猜,之前開發(fā)的活動(dòng)室預(yù)約系統(tǒng)把網(wǎng)站的 keyword 以及 Title 等信息鹦倚,在網(wǎng)站啟動(dòng)的時(shí)候會(huì)從數(shù)據(jù)庫加載配置并保存到 Application
中河质,在需要的地方直接使用 Application
來獲取,后臺(tái)更新配置之后震叙,更新 Application
變量掀鹅,這樣就不需要重啟網(wǎng)站就可以更新網(wǎng)站配置信息了,在 Razor 頁面上使用示例:
<title>@ViewBag.Title - @HttpContext.Current.Application["SystemTitle"]</title>
<meta name="keywords" content="@HttpContext.Current.Application["SystemKeywords"]" />
遷移到 asp.net core 后媒楼,就不能直接這樣用了乐尊,于是自己實(shí)現(xiàn)了一個(gè)服務(wù),去加載網(wǎng)站配置信息划址,比較簡單簡陋扔嵌,權(quán)當(dāng)是拋磚引玉,不喜勿噴
自定義 Application 服務(wù) IApplicationSettingService
服務(wù)接口定義:
public interface IApplicationSettingService
{
string GetSettingValue(string settingKey);
string SetSettingValue(string settingKey, string settingValue);
int AddSettings(Dictionary<string, string> dictionary);
}
基于一個(gè)字典對象的簡單實(shí)現(xiàn):
ApplicationSettingInMemoryService
public class ApplicationSettingInMemoryService : IApplicationSettingService
{
private readonly ConcurrentDictionary<string, string> _settingDictionary = new ConcurrentDictionary<string, string>();
public int AddSettings(Dictionary<string, string> dictionary)
{
if (dictionary != null && dictionary.Count > 0)
{
foreach (var item in dictionary)
{
_settingDictionary[item.Key] = item.Value;
}
}
return _settingDictionary.Count;
}
public string GetSettingValue(string settingKey)
{
_settingDictionary.TryGetValue(settingKey, out var val);
return val;
}
public string SetSettingValue(string settingKey, string settingValue)
{
_settingDictionary[settingKey] = settingValue;
return settingValue;
}
}
也可以根據(jù)自己的需要寫不同的實(shí)現(xiàn)夺颤,比如放在配置中或者自己的緩存中痢缎,這里應(yīng)用暫時(shí)是單體應(yīng)用,所以只是放在了內(nèi)存對象中世澜。
使用
-
在 Startup 中注冊服務(wù):
services.TryAddSingleton<IApplicationSettingService, ApplicationSettingInMemoryService>();
從數(shù)據(jù)庫中讀取配置信息独旷,初始化配置數(shù)據(jù)
-
在 Razor 頁面上使用,示例
@using ActivityReservation.Services @inject IApplicationSettingService applicationSettings /* 此處省略 N 行代碼 ... */ <title>@($"{ViewBag.Title} -- {applicationSettings.GetSettingValue("SystemTitle")}") </title> <meta name="keywords" content="@(applicationSettings.GetSettingValue("SystemKeywords"))" />