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 — ШАБЛОН:
<#@ 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 — РЕЗУЛЬТАТ:
// Автоматически сгенерированный код из шаблона 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 файлы:В Visual Studio: Правый клик на .tt файл → "Run Custom Tool"
В командной строке:
TextTransform.exe ChannelCellTemplate.ttВ CI/CD: Автоматическая генерация перед сборкой
Преимущества T4 для вашей архитектуры:
Массовое создание ячеек: Один шаблон → сотни сгенерированных классов
Конфигурация из JSON: Меняете конфиг → перегенерируете код
Типобезопасность: Генерируется строго типизированный C# код
Шаблонизация поведения: Разные .tt для разных паттернов обработки
Это и есть та самая "фабрика фрактальных ячеек" — пишете конфиг, запускаете шаблон, получаете готовые классы! 🚀
Способ 5: Использование T4 Toolbox (расширенные параметры)
Установка T4 Toolbox:
<PackageReference Include="T4Toolbox" Version="1.0.0" />ChannelCellTemplate.tt с T4 Toolbox:
<#@ 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:<#@ 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();
}
#>
Комментариев нет:
Отправить комментарий