Механизм шаблонизации строк для .Net
-
22-08-2019 - |
Вопрос
Я столкнулся с необходимостью иметь возможность хранить шаблонизированный контент отдельно от кода, который генерирует динамические поля, заполняющие этот контент (например, слияние писем в Word).Вариант использования обычно вращается вокруг того факта, что я хочу написать код, который может отправлять некоторый тип динамического контента (часто электронное письмо), который я хочу позволить своим пользователям настраивать без изменения какого-либо кода.
Например, мы отправляем электронные письма нашим клиентам.В конечном итоге мы настраиваем отправляемые электронные письма и добавляем динамический контент (т. е.например, мы можем сказать «Дорогой {Contact.FirstName}»).Удобно закинуть формат этих писем в базу данных или какой-нибудь XML-файл и написать код, который выдает ему значения всех свойств по отдельности.Поэтому создайте Email.XML с содержимым и механизмом, который принимает этот XML-файл, передает ему объект Contact и возвращает HTML-код электронного письма.Концептуально это очень похоже на цель разделения уровня представления в шаблоне MVC (в данном случае представлением является электронное письмо, движок — контроллером, а объект контакта — моделью).
Похоже, что в пространстве .Net есть два претендента (оба порта Java) (есть еще здесь но они довольно нишевые игроки).
Кто-нибудь использовал какой-либо из этих или других движков шаблонизации?Каковы ключевые различия между ними, которые я должен учитывать при выборе?
Решение
я использовал Стрингтемплате.NET и наслаждался этим опытом.Потребовалось некоторое время, чтобы приспособиться к их мировоззрению — такие вещи, как зацикливание, поначалу кажутся загадочными.Запрещение вызовов шаблонов в код противоречит принципам большинства других библиотек шаблонов.Но как только вы к этому привыкнете, их решения обретут смысл и станут естественными.
Другие советы
Я просто использовал RegEx.Replace и для каждого совпадения, найденного между { и }, я искал тег в словаре <,> и выполнял ITagParser.
Дорогой {Приветствие} {FamilyName}
Текущая дата: {Сейчас=гггг-ММ-дд}.
Где = — необязательный формат.
Это было слишком мало работы, чтобы оправдать стороннюю библиотеку.