在写网站的时候,因为各种需要,决定将部分配置用文件保存起来,使用的时候就把它读到内存中,用静态对象存着,所以可能会有各种各样的配置文件,于是我决定写一个泛型类,将各种配置以json的形式保存起来
public class JsonConfig<T> where T : IJsonConfig, new()
{
public static T Config { get; private set; }
/// <summary>
/// 创建或者修改配置
/// </summary>
/// <param name="siteConfig"></param>
/// <returns></returns>
public static async Task CreateOrUpdateSiteConfig(T siteConfig)
{
await siteConfig.FilePath.SaveJsonAsync(siteConfig);
Config = siteConfig;
}
/// <summary>
/// 获取配置
/// </summary>
/// <returns></returns>
public static async Task<T> GetSiteConfigAsync()
{
if (Config != null)
return Config;
T t = new T();
if (!File.Exists(t.FilePath))
return t;
return Config = await t.FilePath.GetJsonEntityAsync<T>();
}
/// <summary>
/// 获取配置
/// </summary>
/// <returns></returns>
public static T GetSiteConfig()
{
if (Config != null)
return Config;
<span style="color: inherit; font-size: inherit;">T t = new T();</span>
if (!File.Exists(t.FilePath))
return t;
return Config = <span style="color: inherit; font-size: inherit;">t</span><span style="color: inherit; font-size: inherit;">.FilePath.GetJsonEntity<T>();</span><br> }
}
这里T就是各种配置的实体类型
/// <summary>
/// Json配置
/// </summary>
public interface IJsonConfig
{
string FilePath { get; }
}
IJsonConfig 接口是为让每一个实体拥有一个自己定义的路径来储存文件
下面是我博客站点配置的实体
/// 博客站点配置
/// </summary>
public class BlogSiteConfig : ICloneable, IJsonConfig
{
/// <summary>
/// 站点配置路径
/// </summary>
private static string SiteConfig = $"{Directory.GetParent(Assembly.GetEntryAssembly().Location).FullName}/siteconfig.json";
/// <summary>
/// 站点名称
/// </summary>
public string SiteName { get; set; }
/// <summary>
/// 站点首页标题
/// </summary>
public string Title { get; set; }
/// <summary>
/// 站点关键词
/// </summary>
public string KeyWords { get; set; }
/// <summary>
/// 站点简介
/// </summary>
public string Desc { get; set; }
/// <summary>
/// 座右铭
/// </summary>
public string Motto { get; set; }
/// <summary>
/// 座右铭-昵称
/// </summary>
public string Name { get; set; }
/// <summary>
/// Head的HTML代码
/// </summary>
public string HeadHtml { get; set; }
/// <summary>
/// 全局JS代码
/// </summary>
public string StaticJavaScrpit { get; set; }
/// <summary>
/// 备案号
/// </summary>
public string RecordNumber { get; set; }
/// <summary>
/// 微信公众号图片链接
/// </summary>
public string WeChat { get; set; }
/// <summary>
/// 右侧广告代码
/// </summary>
public string RightAdvertisement { get; set; }
public string FilePath => SiteConfig;
public object Clone()
{
return this.MemberwiseClone();
}
}
这里定义了一个静态对象SiteConfig,它就是这个实体的路径(接口里面是不能有静态,抽象类里面也静态不能重写之类的),把实例属性FilePath指向这个静态变量,免得让每一个实体都去拼接和生成路径
上面的SaveJsonAsync和GetJsonEntityAsync皆为String的拓展方法,从名称就可以看出来,前一个是已异步的方式将对象转为JSON保存到指定路径,后一个就是读文件转换成实体了,这个也是泛型方法