Me likez my recipe!!!Pra entender o que a Recipe faz clique aqui. Essa eu vou mostrar ao vivo no TechEd na quinta-feira. Se você quiser entender um pouco vai aqui uma explicação rápida.

Primeiro leia o post do Phil Haack sobre como criar uma Recipe. Ele publicou um nuget que ajuda a fazer o trabalho.

O código da receita é FOSS está públicado no meu BitBucket, se você quiser ir tirando as dúvidas enquanto lê.

Inicialmente o que eu fiz foi instalar o SDK via Nuget conforme o Phil explica. Como eu não tinha a menor intenção de criar todo o código pra converter ASPX pra Razor, só a receita, baixei também o código da Telerik que já fazia isso, o Razor Converter, de lá do GitHub. Compilei e peguei a única dependência que eu precisaria, a Telerik.RazorConverter.dll. Fiz o código usando a API deles (que podia ser melhor). O código principal era basicamente esse:

public bool Execute(ProjectFolder folder)
{
    var parser = new WebFormsParser(/*comprido*/);
    var renderer = new RazorViewRenderer(new RazorNodeRendererProvider());
    var converter = new WebFormsToRazorConverter(/*loooongo*/);

    foreach (var file in folder.Files)
    {
        var folderPath = folder.FullName;
        var filePath = Path.Combine(folderPath, file.Name);

        var webFormsPageSource = File.ReadAllText(filePath, Encoding.UTF8);
        var webFormsDocument = parser.Parse(webFormsPageSource);
        var razorDom = converter.Convert(webFormsDocument);
        var razorPage = renderer.Render(razorDom);
        var outputFileName = Path.Combine(folderPath, Path.GetFileNameWithoutExtension(file.Name) + ".cshtml");
        File.WriteAllText(outputFileName, razorPage, Encoding.UTF8);
        folder.DteProjectItems.AddFromFile(outputFileName);
    }
    return true;
}

Esse código fazia o trabalho de uma maneira simples. Mas dessa forma, se algum arquivo que não fosse aspx estivesse no diretório, teríamos um erro. Além disso, ele não perguntava quais arquivos deveriam ser convertidos, e não verificava que arquivos já haviam sido convertidos. Agora ele faz tudo isso.

Ao fazer a referência para a dll da Telerik e tentar rodar tive um problema, a receita não carregava a dll, mesmo que ela estivesse no mesmo diretório  em que estava a dll da receita. Pra resolver isso só juntando tudo, o que foi o que fiz. Com o ILMerge eu juntei a DLL da Telerik na minha e aí passei a ter uma dll só.

Inclui depois um formulário em WPF. Aí mais um problema, o ILMerge não funcionava. Tive que configurá-lo pra trabalhar em paz com o .NET 4 e o WPF.

Terminei o formulário WPF, atualizei o arquivo de especificação (.nuspec) e refatorei um pouco o arquivo da receita.

Pra reunir isso tudo criei um arquivo (createnuget.cmd) que gerava o nupkg. Basicamente o que ele faz é pegar o resultado da compilação, fazer o ILMerge, e gerar o nuget.

Gerei o arquivo de pacote nuget (Lambda3.ConvertAspxToRazor.0.1.nupkg) e subi ele pro Nuget.org.

Na prática acho que gastei umas 5 horas fazendo tudo, incluindo o aprendizado e a pesquisa. Nada mal.

Giovanni Bassi

Arquiteto e desenvolvedor, agilista, escalador, provocador. É fundador e CSA da Lambda3. Programa porque gosta. Acredita que pessoas autogerenciadas funcionam melhor e por acreditar que heterarquia é mais eficiente que hierarquia. Foi reconhecido Microsoft MVP há mais de dez anos, dos mais de vinte que atua no mercado. Já palestrou sobre .NET, Rust, microsserviços, JavaScript, TypeScript, Ruby, Node.js, Frontend e Backend, Agile, etc, no Brasil, e no exterior. Liderou grupos de usuários em assuntos como arquitetura de software, Docker, e .NET.