воскресенье, 28 июня 2026 г.

DeepSeek, T4, .tt

DeepSeek, T4, .tt

https://chat.deepseek.com/share/cp9m2n74snhekwt3dc

T4 Templates (.tt) — это генераторы исходного кода в Visual Studio и .NET!Что такое T4 (Text Template Transformation Toolkit):

Это технология, которая позволяет автоматически генерировать C# код на основе шаблонов. Вы пишете шаблон с логикой, а Visual Studio генерирует готовый .cs файл.

Простой пример T4 шаблона:

ChannelCellTemplate.tt — ШАБЛОН:

t4
<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".generated.cs" #>
<#@ parameter name="CellName" type="System.String" #>
<#@ parameter name="Capacity" type="System.Int32" #>
<#
    // Это C# код, который выполняется во время генерации
    string className = $"{CellName}ChannelCell";
    string busClassName = $"{CellName}ChannelBus";
#>
// Автоматически сгенерированный код из шаблона ChannelCellTemplate.tt
// Время генерации: <#= DateTime.Now #>

using System;
using System.Threading.Tasks;

namespace FractalCell.Generated
{
    public class <#= className #> : FractalCellTemplate<ChannelInternalBus, ChannelExternalBus>
    {
        private readonly int _capacity = <#= Capacity #>;
        
        public <#= className #>(
            CellConfiguration configuration,
            ChannelInternalBus internalBus,
            ChannelExternalBus externalBus)
            : base(configuration, internalBus, externalBus)
        {
        }

        protected override IEnumerable<BackgroundService> CreateBackgroundServices()
        {
            for (int i = 0; i < Configuration.BackgroundServiceCount; i++)
            {
                yield return new ChannelBackgroundService(
                    $"<#= CellName #>-worker-{i}",
                    InternalBus,
                    Logger,
                    Configuration);
            }
        }

        protected override void ConfigureHandlers()
        {
            InternalBus.Subscribe<FractalEvent>(async fractalEvent =>
            {
                Logger.LogInformation("<#= CellName #> received: {EventType}", 
                    fractalEvent.EventType);
                
                // Специфичная логика для <#= CellName #>
                await Process<#= CellName #>EventAsync(fractalEvent);
            });
        }

        private async Task Process<#= CellName #>EventAsync(FractalEvent @event)
        {
            // Кастомная обработка для этой ячейки
            Logger.LogInformation("Processing in <#= CellName #> cell with capacity <#= Capacity #>");
            
            switch (@event.EventType)
            {
                case "<#= CellName #>DataProcess":
                    // Специфичная обработка
                    break;
                default:
                    await ExternalBus.SendToCellAsync(@event.TargetCellId, @event);
                    break;
            }
        }
    }
}
Что получится при генерации:

При запуске шаблона с параметрами CellName = "Stratosphere" и Capacity = 5000 сгенерируется:

ChannelCellTemplate.generated.cs — РЕЗУЛЬТАТ:

csharp
// Автоматически сгенерированный код из шаблона ChannelCellTemplate.tt
// Время генерации: 22.06.2026 15:30:00

using System;
using System.Threading.Tasks;

namespace FractalCell.Generated
{
    public class StratosphereChannelCell : FractalCellTemplate<ChannelInternalBus, ChannelExternalBus>
    {
        private readonly int _capacity = 5000;
        
        public StratosphereChannelCell(
            CellConfiguration configuration,
            ChannelInternalBus internalBus,
            ChannelExternalBus externalBus)
            : base(configuration, internalBus, externalBus)
        {
        }

        protected override IEnumerable<BackgroundService> CreateBackgroundServices()
        {
            for (int i = 0; i < Configuration.BackgroundServiceCount; i++)
            {
                yield return new ChannelBackgroundService(
                    $"Stratosphere-worker-{i}",
                    InternalBus,
                    Logger,
                    Configuration);
            }
        }

        protected override void ConfigureHandlers()
        {
            InternalBus.Subscribe<FractalEvent>(async fractalEvent =>
            {
                Logger.LogInformation("Stratosphere received: {EventType}", 
                    fractalEvent.EventType);
                
                // Специфичная логика для Stratosphere
                await ProcessStratosphereEventAsync(fractalEvent);
            });
        }

        private async Task ProcessStratosphereEventAsync(FractalEvent @event)
        {
            // Кастомная обработка для этой ячейки
            Logger.LogInformation("Processing in Stratosphere cell with capacity 5000");
            
            switch (@event.EventType)
            {
                case "StratosphereDataProcess":
                    // Специфичная обработка
                    break;
                default:
                    await ExternalBus.SendToCellAsync(@event.TargetCellId, @event);
                    break;
            }
        }
    }
}
Как использовать .tt файлы:
  1. В Visual Studio: Правый клик на .tt файл → "Run Custom Tool"

  2. В командной строке: TextTransform.exe ChannelCellTemplate.tt

  3. В CI/CD: Автоматическая генерация перед сборкой

Преимущества T4 для вашей архитектуры:

  • Массовое создание ячеек: Один шаблон → сотни сгенерированных классов

  • Конфигурация из JSON: Меняете конфиг → перегенерируете код

  • Типобезопасность: Генерируется строго типизированный C# код

  • Шаблонизация поведения: Разные .tt для разных паттернов обработки

Это и есть та самая "фабрика фрактальных ячеек" — пишете конфиг, запускаете шаблон, получаете готовые классы! 🚀

Способ 5: Использование T4 Toolbox (расширенные параметры)

Установка T4 Toolbox:

xml
<PackageReference Include="T4Toolbox" Version="1.0.0" />

ChannelCellTemplate.tt с T4 Toolbox:

t4
<#@ template language="C#" hostspecific="true" #>
<#@ output extension=".generated.cs" #>
<#@ include file="T4Toolbox.tt" #>
<#
    // Создаем генератор с параметрами
    var generator = new CellGenerator
    {
        CellName = "Stratosphere",
        Capacity = 5000,
        WorkerCount = 3
    };
    
    generator.Run();
#>
Способ 6: Интерактивный ввод (для отладки)
ChannelCellTemplate.tt:
t4
<#@ template debug="true" hostspecific="true" language="C#" #>
<#@ output extension=".generated.cs" #>
<#
    // При debug=true можно использовать интерактивный ввод
    string cellName = "Stratosphere";
    int capacity = 5000;
    int workers = 3;
    
    if (this.Errors.HasErrors == false)
    {
        // В режиме отладки можно запросить параметры
        Console.Write("Enter cell name: ");
        cellName = Console.ReadLine();
    }
#>

Комментариев нет:

Отправить комментарий