Как я могу создать загружаемый класс 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 в быстрые вызовы методов, используя шаблон компоновщика. Я создал личную библиотеку, которая использует этот подход, и она очень успешно повысила мою производительность с помощью генерации кода.

Другие вопросы по тегам