Anteriormente en NoCompila.com vimos como hacer un aplicación hola mundo por consola.
Hoy vamos a hacer lo mismo, pero con una aplicación Asp.Net Core. Es decir, vamos a dejar que el comando dotnet haga toda la magia y nos deje un punto de partida donde comenzar a crear nuestra aplicación web.
Es muy sencillo, al igual que la en el caso de una aplicación de consola, crearemos un directorio y con el comando dotnet crearemos una aplicación, pero esta vez le indicaremos con el parámetro “-t Web” que queremos una aplicación de tipo web
E:\Desarrollo>md AspNetMola E:\Desarrollo>cd AspNetMola E:\Desarrollo\AspNetMola>dotnet new -t Web Created new C# project in E:\Desarrollo\AspNetMola. E:\Desarrollo\AspNetMola>dir Directorio de E:\Desarrollo\AspNetMola 21/07/2016 21:06 <DIR> . 21/07/2016 21:06 <DIR> .. 21/06/2016 20:10 36 .bowerrc 21/06/2016 20:10 3.889 .gitignore 21/06/2016 20:10 265 appsettings.json 21/06/2016 20:10 214 bower.json 21/07/2016 21:06 <DIR> Controllers 21/07/2016 21:06 <DIR> Data 21/06/2016 20:10 1.193 gulpfile.js 21/07/2016 21:06 <DIR> Models 21/06/2016 20:10 239 package.json 21/06/2016 20:10 574 Program.cs 21/06/2016 20:10 3.322 project.json 21/06/2016 20:10 2.229 README.md 21/07/2016 21:06 <DIR> Services 21/06/2016 20:10 3.193 Startup.cs 21/07/2016 21:06 <DIR> Views 21/06/2016 20:10 563 web.config 21/07/2016 21:06 <DIR> wwwroot 11 archivos 15.717 bytes 8 dirs 25.956.794.368 bytes libres E:\Desarrollo\AspNetMola>
Como podemos ver la estructura del proyecto es mucho más compleja que la anterior, demasiada magia para mi gusto, pero lo que nos ha generado es el esqueleto de una aplicación completa en Asp.Net Core con MVC 6.
Esta vez el fichero project.json es mucho más grande que el de la consola, porque tenemos dependencias con asp.net, MVC, Entity Frameworks y más, eso se nota cuando ejecutamos dotnet restore para descargar las dependencias
E:\Desarrollo\AspNetMola>dotnet restore log : Restoring packages for E:\Desarrollo\AspNetMola\project.json... log : Restoring packages for tool 'Microsoft.AspNetCore.Razor.Tools' in E:\Desarrollo\AspNetMola\project.json... log : Restoring packages for tool 'Microsoft.AspNetCore.Server.IISIntegration.Tools' in E:\Desarrollo\AspNetMola\project.json... log : Restoring packages for tool 'Microsoft.EntityFrameworkCore.Tools' in E:\Desarrollo\AspNetMola\project.json... log : Restoring packages for tool 'Microsoft.Extensions.SecretManager.Tools' in E:\Desarrollo\AspNetMola\project.json... log : Restoring packages for tool 'Microsoft.VisualStudio.Web.CodeGeneration.Tools' in E:\Desarrollo\AspNetMola\project.json... log : Writing lock file to disk. Path: E:\Desarrollo\AspNetMola\project.lock.json log : E:\Desarrollo\AspNetMola\project.json log : Restore completed in 17845ms.
Pero al final, en Asp.net Core una aplicación web no deja de ser una aplicación de consola que lanza un servidor web. De tal manera, que el punto de inicio de la aplicación es un método public static void main, que en este caso se encuentra en el fichero Program.cs
public class Program { public static void Main(string[] args) { var host = new WebHostBuilder() .UseKestrel() .UseContentRoot(Directory.GetCurrentDirectory()) .UseIISIntegration() .UseStartup<Startup>() .Build(); host.Run(); } }
Si os fijais lo único que hace es crear un servidor web (WebHostBuilder) y lo configura utilizando una api fluida. Lo más interesante es ".UseStartup<Startup>()" donde le indica que para inicar la aplicación web utilice la clase Startup. Es en esa clase donde se configura la aplicación.
public class Startup { public Startup(IHostingEnvironment env) { var builder = new ConfigurationBuilder() .SetBasePath(env.ContentRootPath) .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true); if (env.IsDevelopment()) { // For more details on using the user secret store see https://go.microsoft.com/fwlink/?LinkID=532709 builder.AddUserSecrets(); } builder.AddEnvironmentVariables(); Configuration = builder.Build(); } public IConfigurationRoot Configuration { get; } // This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { // Add framework services. services.AddDbContext<ApplicationDbContext>(options => options.UseSqlite(Configuration.GetConnectionString("DefaultConnection"))); services.AddIdentity<ApplicationUser, IdentityRole>() .AddEntityFrameworkStores<ApplicationDbContext>() .AddDefaultTokenProviders(); services.AddMvc(); // Add application services. services.AddTransient<IEmailSender, AuthMessageSender>(); services.AddTransient<ISmsSender, AuthMessageSender>(); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { loggerFactory.AddConsole(Configuration.GetSection("Logging")); loggerFactory.AddDebug(); if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); app.UseDatabaseErrorPage(); app.UseBrowserLink(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseIdentity(); // Add external authentication middleware below. To configure them please see https://go.microsoft.com/fwlink/?LinkID=532715 app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); } }
En el cosntructor tenemos donde se cargan los ficheros de condiguración de la aplicacion web, se cargan las variables de entorno, etc.
Asp.Net Core trae integrado un IoC Container que se configura en el método ConfigureServices. En el ejemplo podemos ve como se registra el uso de MVC, un repositorio de EF y más servicios.
Por último, en el método Configure se configuran dos cosas, por un lado el pipeline de Asp.Net Core (de la que espero hablar en futuros post), o lo que es lo mismo el ciclo de vida de una petición web desde que llega al código .net en el servdor. Por otro lado, asp.net core trae integrado un motor de logs, en la aplicación de ejemplo lo configuran para que escriba la salida por consola y que escriba a partir del nivel debug.
Lo cierto es que esta aplicación es un buen punto de inicio para los que quieran aprender a hacer aplicaciones web con MVC 6, pero tiene demasiada magia sin explicar. Asi que los que no quieran complicarse la visa y utilizar un framework de desarrollo web este es su punto de inicio: la página esta llena de enlaces para aprender a hacer acceso a datos, configurar la aplicacion, gestion del log, etc. De hecho vamos a ejecutarla para ver esos enlaces:
E:\Desarrollo\AspNetMola>dotnet run Project AspNetMola (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing Compiling AspNetMola for .NETCoreApp,Version=v1.0 Compilation succeeded. 0 Warning(s) 0 Error(s) Time elapsed 00:00:05.1090688 info: Microsoft.Extensions.DependencyInjection.DataProtectionServices[0] User profile is available. Using 'C:\Users\Manel\AppData\Local\ASP.NET\DataProtection-Keys' as key repository and Windows DPAPI to encrypt keys at rest. Hosting environment: Production Content root path: E:\Desarrollo\AspNetMola Now listening on: http://localhost:5000 Application started. Press Ctrl+C to shut down.
Como se puede ver en la salida, por defecto se monta un servidor web que está escuchando en el puerto 5000 de nuestra máquina así que si ejecutamos un navegador nos encontraremos con una aplicación web con todos los enlaces a la documentación de .net de los que hablábamos antes
No hay comentarios:
Publicar un comentario