3
respostas

dúvida sobre o Configure()

Aproximadamente aos 05:47 do 4° video da Aula 1 é dito que o metodo Run da istancia app receberia como parâmetro o método responsável por responder a requisição, neste caso o 'LivrosParaLer(HttpContext context)'

O parâmetro no entanto é passado com o nome do método sem o '()' e o devido parâmetro , como se fosse uma variável e não um método. Mesmo assim o compilador reconheceu que era um método e disse que o tipo de retorno não era o esperado. Depois, no decorrer da aula, o tipo do retorno de LivrosParaLer é alterado para Task como foi explicado, mas mesmo assim não ficou claro como o compilador entendeu que 'LivrosParaLer' era um método...

Isso está explicado em algum outro curso pré-requisito ou é detalhado mais a frente?

3 respostas

Olá Douglas!

Isso acontece porque o parâmetro context do tipo HttpContext é injetado (pela injeção de dependência) no método LivrosParaLer. Com isso você não define de onde está vindo o esse parâmetro e quem decide é o próprio Asp.NET Core qual será esse objeto do tipo HttpContext (ele cria esse objeto por debaixo dos panos). Com isso, você não indica (passando o parâmetro) qual é esse objeto que será usado no método LivrosParaLer.

Injeção de dependência é um assunto meio extenso, ams se quiser mais informações, segue esse link da documentação.

Espero ter ajudado!

Não sei se consegui me fazer claro , pois não entendi a relação entre a minha pergunta e a resposta. Até onde eu sei em C# quando chamo uma função como parâmetro de outra o que será enviado de fato é o retorno dessa função, e para identificar que é isso que quero deve haver o '()' É diferente do Javascript por exemplo, onde eu posso querer o retorno da função usando o '()' ou posso querer o conteúdo da função só cm o seu nome. Esse é o funcionamento até onde eu sei, mas posso estar errado..... Se eu estiver errado, é na Injeção de Dependência que vai estar explicação para essa diferença de sintaxe? Estou confuso pq a sintaxe não me parece consistente....Nos outros pontos do código onde é feita menção a injeção de dependencia existe o '()'.

Vamos recapitular o que eu entendi: O método Run está pedindo um objeto do tipo RequestDelegate pela dica do compilador mostrada no video. Ao invés disso o instrutor está sendo passado um nome de método método sem o '()'.

A julgar estritamente pela sintaxe me parece o seguinte: Dada a ausencia do '()' sou levado a crer que aquilo não é um método de fato, mas sim uma instãncia de alguma coisa que não sei o que é. Essa 'coisa' seja ela qua for será convertida ou usada por algum mecanismo para chegar no método de mesmo nome (talvez aqui entre algo relacionado à injeção de dependência). O método será então executado e retornara a Task ,que neste caso parece ser um tipo derivado de RequestDelegate.

Meu raciocínio tem fundamento? Se a resposta para isso estiver mesmo nessa documentação da Injeção de Dependência eu vou ler tudo ( e levar um tempo) para entender e confirmo depois o que consegui absorver.

Douglas, na verdade tem sim, mas não tanto quanto eu tinha afirmado. O que tinha me passado desapercebido é que app.Run(); pede um delegate. (Mais informações aqui)

Ao colocar os parênteses, o compilador dá erro e já mostra que precisa do RequestDelegate que o Daniel falou.

Reescrevi o código, como uma função anônima, usando de parâmetro para app.Run(); e o código ficou assim:

public void Configure(IApplicationBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync(new LivroRepositorioCSV().ParaLer.ToString());
            });
        }

Agora, mesmo sem explicitar em lugar algum que precisamos de um objeto do tipo HttpContext, recebemos esse objeto, como a seguir:

Pelo que entendi, não se usa parênteses porque esse método recebe um objeto do tipo HttpContext via injeção de dependência (que no código comprimido não é nem citado), e retorna uma Task . Se colocar os parênteses, o compilador vai pedir para você escrever o delegate (que nesse caso, já está dentro do método). E em momento algum pede para indicar de onde vem esse objeto do tipo HttpContext.

Espero que dessa vez eu não tenha dado mancada. Mas claro, a resposta não está na injeção de dependência. Fui navegando de classe em classe (que tem a ver com o código) na documentação e não encontrei nenhuma resposta óbvia sobre isso.

EDIT: Só para testar, apaguei o LivrosParaTestar de dentro de app.Run() e comecei escrever novamente para ver a sugestão e o resultado ao começar escrever e apertar o foi que veio sem os parênteses, mas indica que recebe o HttpContext como parâmetro do método:

Pelo que vi, tem a ver com handler, mas ainda tenho que pesquisar a fundo.