C# 如何最好地在C语言中存储/访问/操作包含大量双引号的很长字符串#

C# 如何最好地在C语言中存储/访问/操作包含大量双引号的很长字符串#,c#,asp.net,C#,Asp.net,我有一个70KB的电子邮件正文(HTML),带有100个双引号。我需要用一个人的名字、年龄等来替换它的一小部分(我有这些项目的占位符) 我不想将其存储在SQL Server DB中的nvarchar(max)字段中,因为这意味着每次发送电子邮件时都需要访问它,这可能是每秒多次的,而且数据库位于另一台服务器上。我不想在web应用程序启动时将其读入内存,因为我希望能够在不停止网站的情况下不时更改正文 也许我只是使用一个位于应用程序文件结构中的纯文本文件,并为每封电子邮件阅读它。这样我可以随意改变它的

我有一个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();
}
}
为什么不呢