C# 如何最好地在C语言中存储/访问/操作包含大量双引号的很长字符串#
我有一个70KB的电子邮件正文(HTML),带有100个双引号。我需要用一个人的名字、年龄等来替换它的一小部分(我有这些项目的占位符) 我不想将其存储在SQL Server DB中的nvarchar(max)字段中,因为这意味着每次发送电子邮件时都需要访问它,这可能是每秒多次的,而且数据库位于另一台服务器上。我不想在web应用程序启动时将其读入内存,因为我希望能够在不停止网站的情况下不时更改正文 也许我只是使用一个位于应用程序文件结构中的纯文本文件,并为每封电子邮件阅读它。这样我可以随意改变它的内容C# 如何最好地在C语言中存储/访问/操作包含大量双引号的很长字符串#,c#,asp.net,C#,Asp.net,我有一个70KB的电子邮件正文(HTML),带有100个双引号。我需要用一个人的名字、年龄等来替换它的一小部分(我有这些项目的占位符) 我不想将其存储在SQL Server DB中的nvarchar(max)字段中,因为这意味着每次发送电子邮件时都需要访问它,这可能是每秒多次的,而且数据库位于另一台服务器上。我不想在web应用程序启动时将其读入内存,因为我希望能够在不停止网站的情况下不时更改正文 也许我只是使用一个位于应用程序文件结构中的纯文本文件,并为每封电子邮件阅读它。这样我可以随意改变它的
如果我实例化的stringbuilder的内容就是这个文件,那么双引号也会导致问题。我希望使用它的替换方法来替换占位符。如果我理解你的内容字符串的意思,它是你实际电子邮件的一种通用模板。您最终将更改此模板,因此每次访问它时它都必须是最新的,但您不希望在需要时随时获取它以避免往返 这有一个名字,它是“缓存”。您可能有各种方法来实现这一点,但最简单的方法是将其存储在应用程序级别,并使用延迟加载访问器来检索它。只需在每次更新模板时删除此缓存,然后选择对访问器进行虚拟调用,以便重建此缓存数据 StringBuilder将处理双引号,不会出现任何问题。如果从文件中读取内容字符串,或任何不需要立即初始化的内容,则StringBuilder会在内部转义双引号 如果不需要为用户提供UI来更新模板,则可能应该使用.Net资源机制(resx文件) 简单的例子:
public static class EmailHelper
{
private static string _templateString;
private const string APP_KEY = "EmailTemplate";
public static string TemplateString
{
get
{
// Lazy loading pattern at Application's level
if (_templateString == null)
{
// if also null, fetch from your persistance layer
if (Application[APP_KEY] == null)
{
var template = System.IO.File.ReadAllText(@"C:\Temp\Delete Anytime\EmailBody.txt");
Application[APP_KEY] = template;
_templateString = template;
}
}
return _templateString;
}
set
{
// value should come from reading your text file
Application[APP_KEY] = value;
// cache invalidation
_templateString = null;
}
}
public static string ResolvePlaceholders(Dictionnary<string, string> keyValuePairs)
{
// initiate a string builder from the template
var contentBuilder = new StringBuilder(TemplateString);
// dictionnary keys are your placeholders
// values are actual content
foreach(var kvp in keyValuePairs)
{
contentBuilder.Replace(kvp.Key, kvp.Value);
}
return contentBuilder.ToString();
}
}
公共静态类EmailHelper
{
私有静态字符串_templateString;
私有常量字符串APP_KEY=“EmailTemplate”;
公共静态字符串模板字符串
{
得到
{
//应用程序级别的延迟加载模式
如果(_templateString==null)
{
//如果也为null,则从持久层获取
if(应用程序[应用程序密钥]==null)
{
var template=System.IO.File.ReadAllText(@“C:\Temp\Delete Anytime\EmailBody.txt”);
应用程序[应用程序密钥]=模板;
_templateString=模板;
}
}
返回_templateString;
}
设置
{
//值应该来自读取文本文件
应用程序[应用程序键]=值;
//缓存失效
_templateString=null;
}
}
公共静态字符串解析占位符(字典键值对)
{
//从模板启动字符串生成器
var contentBuilder=新的StringBuilder(TemplateString);
//发音键是你的占位符
//值是实际内容
foreach(keyValuePairs中的var kvp)
{
替换(kvp.Key,kvp.Value);
}
返回contentBuilder.ToString();
}
}
如果我理解您的内容字符串的含义,它是您实际电子邮件的一种通用模板。您最终将更改此模板,因此每次访问它时它都必须是最新的,但您不希望在需要时随时获取它以避免往返
这有一个名字,它是“缓存”。您可能有各种方法来实现这一点,但最简单的方法是将其存储在应用程序级别,并使用延迟加载访问器来检索它。只需在每次更新模板时删除此缓存,然后选择对访问器进行虚拟调用,以便重建此缓存数据
StringBuilder将处理双引号,不会出现任何问题。如果从文件中读取内容字符串,或任何不需要立即初始化的内容,则StringBuilder会在内部转义双引号
如果不需要为用户提供UI来更新模板,则可能应该使用.Net资源机制(resx文件)
简单的例子:
public static class EmailHelper
{
private static string _templateString;
private const string APP_KEY = "EmailTemplate";
public static string TemplateString
{
get
{
// Lazy loading pattern at Application's level
if (_templateString == null)
{
// if also null, fetch from your persistance layer
if (Application[APP_KEY] == null)
{
var template = System.IO.File.ReadAllText(@"C:\Temp\Delete Anytime\EmailBody.txt");
Application[APP_KEY] = template;
_templateString = template;
}
}
return _templateString;
}
set
{
// value should come from reading your text file
Application[APP_KEY] = value;
// cache invalidation
_templateString = null;
}
}
public static string ResolvePlaceholders(Dictionnary<string, string> keyValuePairs)
{
// initiate a string builder from the template
var contentBuilder = new StringBuilder(TemplateString);
// dictionnary keys are your placeholders
// values are actual content
foreach(var kvp in keyValuePairs)
{
contentBuilder.Replace(kvp.Key, kvp.Value);
}
return contentBuilder.ToString();
}
}
公共静态类EmailHelper
{
私有静态字符串_templateString;
私有常量字符串APP_KEY=“EmailTemplate”;
公共静态字符串模板字符串
{
得到
{
//应用程序级别的延迟加载模式
如果(_templateString==null)
{
//如果也为null,则从持久层获取
if(应用程序[应用程序密钥]==null)
{
var template=System.IO.File.ReadAllText(@“C:\Temp\Delete Anytime\EmailBody.txt”);
应用程序[应用程序密钥]=模板;
_templateString=模板;
}
}
返回_templateString;
}
设置
{
//值应该来自读取文本文件
应用程序[应用程序键]=值;
//缓存失效
_templateString=null;
}
}
公共静态字符串解析占位符(字典键值对)
{
//从模板启动字符串生成器
var contentBuilder=新的StringBuilder(TemplateString);
//发音键是你的占位符
//值是实际内容
foreach(keyValuePairs中的var kvp)
{
替换(kvp.Key,kvp.Value);
}
返回contentBuilder.ToString();
}
}
为什么不呢