Как я могу создать загружаемый класс C# на веб-сайте ASP.NET MVC?
Я уверен, что это очень странное требование, но здесь идет.
У нас есть некоторый код конфигурации клиента, который представлен классами C#, который мы компилируем в библиотеку классов. Создание этих классов конфигурации в настоящее время является непростой работой, которую я хотел бы поручить кому-то, кроме разработчика. Поэтому мы создаем веб-сайт "Конфигуратор", который бизнес-аналитик может использовать для создания действительных классов C#, заполнив форму с выбранными соответствующими параметрами.
Каков наилучший способ создания класса C# из шаблона на веб-сайте MVC? Обратите внимание, что я не говорю здесь о динамическом создании и выполнении класса во время выполнения: мы по сути генерируем текстовый файл, который просто содержит код C#, который будет включен в совершенно другой проект.
Это очень сложная тема для Google! Варианты, которые дошли до сих пор...
- просто используйте токенизированный текстовый файл и замените значения с помощью String.Format
- каким-то образом использовать Razor в качестве движка шаблонов (но не уверен, каким образом, и мы не генерируем html)
- каким-то образом использовать шаблоны T4 (по крайней мере, я знаю, что он используется для генерации C#, но не уверен, как выполнить во время выполнения)
Есть идеи, как лучше к этому подойти?
Как и требовалось, вот пример выходного класса / файла. Приведенные здесь значения переопределяют значения, установленные в базовом классе, с помощью пользовательских меток, проверки и т. Д. Таким образом, мы настраиваем наш продукт для клиентов.
public class AreaRiskTemplate: AreaRiskTemplateBase
{
public override string EntityName { get { return "risk"; } }
public override string EntityNamePlural { get { return "risks"; } }
public override string EntityNameArticle { get { return "a"; } }
public override string CGovItemRefPrefix { get { return "R"; } }
public override void SetFieldDefinitions()
{
FieldDefinitions.Level1.IsImplemented = true;
FieldDefinitions.Level1.Label = "Category";
FieldDefinitions.Level1.IsVisibleInGrid = true;
FieldDefinitions.Level2.IsImplemented = true;
FieldDefinitions.Level2.Label = "Team";
FieldDefinitions.Level2.IsVisibleInGrid = true;
FieldDefinitions.Description.IsImplemented = true;
FieldDefinitions.Description.Label = "Description";
FieldDefinitions.Description.IsVisibleInGrid = true;
}
public override ModelStateDictionary Validate()
{
var msd = new ModelStateDictionary();
// add template-specific validation here
msd.Merge(base.Validate());
return msd;
}
public override List<string> Level1Options
{
get
{
return new List<string>
{
"Organisational",
"Financial",
"Operational",
"External",
"IT"
};
}
}
}
Обновление: в настоящее время исследуются шаблоны T4 по адресу http://msdn.microsoft.com/en-us/library/ee844259(v=vs.100).aspx (благодаря комментариям ниже). Выглядит многообещающе.
2 ответа
Я предлагаю избегать веб-сайта, и вместо этого просто идти с CodeSmith. Вы можете разработать сценарии CodeSmith, чтобы они запрашивали информацию, а затем генерировали необходимый код. Похоже, гораздо меньше работы, хотя вы должны купить CodeSmith.
Способ сделать это с наименьшими издержками - использовать встроенный в CodeDOM API от Microsoft. Это позволяет создавать и манипулировать документами с кодом CLR с помощью кросс-совместимой объектной модели документов.
Единственным недостатком этого подхода является то, что не сразу очевидно, как реализовать некоторые языковые особенности. Примером является C# readonly
поля, потому что они не доступны на каждом языке CLR, но только в C#. Решение этой конкретной сложности заключается в использовании CodeSnippet
и вставьте ручной код в виде строки. Другие более сложные проблемы несоответствия могут быть смягчены путем интеграции CodeDOM с механизмом шаблонов. Олег Сыч написал полезную статью об интеграции CodeDOM с движком шаблонов T4. Я предпочитаю такой подход подходу к генерации чистого текста, потому что строго типизированная объектная модель документа менее подвержена ошибкам, чем чистый текст.
Кроме того, если вы когда-нибудь захотите скомпилировать выходной код, это также поддерживается API CodeDOM.
Если вы считаете, что это практика, которую вы часто используете, вы можете включить некоторые общие функции манипулирования DOM в быстрые вызовы методов, используя шаблон компоновщика. Я создал личную библиотеку, которая использует этот подход, и она очень успешно повысила мою производительность с помощью генерации кода.