jueves, 21 de julio de 2016

Hola Asp.Net Core

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

image

No hay comentarios:

Publicar un comentario