martes, 5 de marzo de 2019
Blogger invitado
Jorge Turrado
Apasionado de la programación, siempre buscando la manera de mejorar el día a día con el desarrollo de tecnologías .NET. Apasionado de este momento tan cambiante y fabuloso para ser desarrollador C#.Como desarrollador del ecosistema .NET, seguro que alguna vez has usado el gestor de paquetes NuGet (y si aún no lo has hecho, lo acabarás haciendo antes o después, créeme). Esta herramienta permite empaquetar componentes que cumplen una necesidad determinada, ya sea de terceros o internos de nuestra empresa, dejándolos listos para obtenerlos e incluirlos rápidamente en nuestros proyectos sin tener que compilarlos cada vez o almacenarlos en forma de binarios en una enorme carpeta con cientos de librerías.
Su máximo referente es el repositorio público Nuget.org, integrado dentro de Visual Studio y repositorio de facto de .NET Core, aunque también existen repositorios NuGet privados, o incluso puedes crear el tuyo sin ningún problema bajándote el paquete Nuget.Server desde el propio Nuget.org e implementándolo, ¿es poético verdad? 😊).
Ahora que hemos introducido qué es NuGet para quien no lo supiese, tal vez te hayas preguntado cómo es posible crear un paquete NuGet y publicarlo para que otros desarrolladores puedan utilizarlo. Vamos a ver que es algo realmente sencillo.
Publicado por José M. Aguilar a las 10:00 a. m.
Hay
4 comentarios, ¡participa tú también!
Etiquetas: colaboraciones, jorgeturrado, nuget
lunes, 4 de marzo de 2019
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Lambdas como árboles de expresión
José María Aguilar - Usar Razor desde una aplicación de consola .NET Core (2 de 2)
José María Aguilar
.NET / .NET Core
- An update to C# versions and C# tooling
Phillip Carter - DateTime.Now: Usage, Examples, Best Practices, and Pitfalls
Carlos Schults - AKS, KeyVault y netcore
Eduard Tomás - How to Create, Use, and Debug .NET application Crash Dumps in 2019
Michael Shpilt - Creating Custom Web Crawler with Dotnet Core using Entity Framework Core
Mehmet Ozkaya - C# 8.0 in-depth: Setup C# 8.0 and .NET Core 3.0
Dix Yan - An Introduction to Optimising Code Using Span
Steve Gordon - WhiteList Proxying with ASP.Net Core
John Reilly - TransientFaultHandling.Core: Retry library for .NET Core/.NET Standard
Dixin Yan - An example of interaction-based testing in C#
Mark Seemann - Runtime analysis and leak detection for Autofac
Nicholas Blumhardt - C# 8 surprising patterns & Discards and underscores & Tuple deconstruction and positional patterns] & Variable declarations and type patterns
Ian Griffiths - AutoMapper Usage Guidelines
Jimmy Bogard - How to port desktop applications to .NET Core 3.0
Olia Gavrysh - Learning about .NET Core futures by poking around at David Fowler's GitHub
Scott Hanselman - Is C# a low-level language?
Matt Warren
martes, 26 de febrero de 2019
Sin duda, Entity Framework Core es un gran marco de trabajo para implementar el acceso a datos de nuestras aplicaciones, pues es rápido, potente y nos ahorra una gran cantidad de esfuerzo, sobre todo en proyectos muy centrados en datos.
Sin embargo, estas ayudas tienen un coste importante, al igual que ocurre con casi cualquier framework al que vayamos a confiar parte de nuestro sistema, sea del ámbito que sea: hay que conocerlo bien para no dispararse en un pie en cuanto apretemos el gatillo.
Hace muuuuchos, muchos años hablamos de cómo aplicar convenientemente la carga anticipada (eager loading) en Entity Framework podía acelerar de forma drástica el rendimiento en el acceso a datos de nuestras aplicaciones, evitando el temido problema denominado "SELECT N+1". Esto continúa siendo válido para la versión Core de este marco de trabajo: sigue existiendo el extensor
Pues bien, en EF Core hay otro detalle que, si bien utilizándolo con conocimiento puede resultar muy interesante, es fácil que nos tumbe el rendimiento de nuestros accesos a datos si no lo usamos con cuidado: la evaluación en cliente.
Sin embargo, estas ayudas tienen un coste importante, al igual que ocurre con casi cualquier framework al que vayamos a confiar parte de nuestro sistema, sea del ámbito que sea: hay que conocerlo bien para no dispararse en un pie en cuanto apretemos el gatillo.
Hace muuuuchos, muchos años hablamos de cómo aplicar convenientemente la carga anticipada (eager loading) en Entity Framework podía acelerar de forma drástica el rendimiento en el acceso a datos de nuestras aplicaciones, evitando el temido problema denominado "SELECT N+1". Esto continúa siendo válido para la versión Core de este marco de trabajo: sigue existiendo el extensor
Include()
e incluso variantes de éste como ThenInclude()
que permiten incluir en una única consulta las entidades que sabemos que vamos a necesitar.Pues bien, en EF Core hay otro detalle que, si bien utilizándolo con conocimiento puede resultar muy interesante, es fácil que nos tumbe el rendimiento de nuestros accesos a datos si no lo usamos con cuidado: la evaluación en cliente.
lunes, 25 de febrero de 2019
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Expresiones lambda como delegados
José María Aguilar - Capturar la pantalla con Windows 10
José María Aguilar
.NET / .NET Core
- .NET Core 1.0 and 1.1 will reach End of Life on June 27, 2019
Rich Lander - Announcing .NET Framework 4.8 Early Access Build 3745
Namrata Karnam - C# 8 – Introducing Index struct and a brand new usage for the hat operator – Developers Anonymous
John Demetriou - Dynamically compile and run code using .NET Core 3.0
Laurent Kempé - Novedades de C# 8
Fernando Escolar - Novedades de C# 8.0 al escenario
David Gonzalo - Universal hierarchy traversing in C#
Gunnar Peipman - Switching Between .NET Core SDK Versions
Faisal Pathan - Introduction to Benchmarking C# Code with Benchmark .NET
Steve Gordon - .NET Internals Cookbook Part 1 — Exceptions, filters and corrupted processes
Adam Furmanek - C# 8: Default Interface Methods Implementation
Dawid Sibiński - How to exclude code from code coverage
Gunnar Peipman - Heap vs stack, value type vs reference type
Konrad Kokosa - HttpClient Creation and Disposal Internals: Should I Dispose of HttpClient?
Steve Gordon - What's the Difference Between Razor and Blazor?!?
Jason Robert - Dependency Injection for Quartz.NET in .NET Core
Bohdan Stupak - Exploring .NET Core 3.0 new API
Patrick Smacchia
martes, 19 de febrero de 2019
Una gestión apropiada de la caché es muchas veces el secreto para los sistemas de alto rendimiento o que tienen que atender a una gran carga de peticiones por segundo, y el framework ASP.NET Core MVC incluye numerosas herramientas para ello.
Entre otras, el tag helper
Si volvemos a acceder a la misma vista durante esos 30 segundos, el resultado será mostrado inmediatamente (sin esperar los tres segundos) y el cliente recibirá el contenido que se cacheó durante la primera visita. Al transcurrir este plazo, en la siguiente petición se volverá a procesar el contenido del tag helper, ejecutándose la espera y volviendo a generar y cachear el resultado enviado al cliente.
Pero podemos tener ejemplos algo más complejos, como el siguiente. En el interior del tag helper hemos insertado un view component que podría mostrar las últimas noticias obtenidas de una base de datos, en lo que podría ser la página de inicio de un servicio de información on-line:
Entre otras, el tag helper
<cache>
es especialmente útil para almacenar en la memoria del servidor el resultado de procesar una porción de página o vista, de forma que pueda ser reutilizada en peticiones siguientes. Un ejemplo bastante básico, pero que deja bastante clara su utilidad y forma de uso, podría ser el siguiente:<h1>Atomic clock</h1>
<cache expires-after="@TimeSpan.FromSeconds(30)">
@{
await Task.Delay(3000);
}
Current time: @DateTime.UtcNow.ToLongTimeString()
</cache>
Al acceder a una vista con el código anterior por primera vez, se producirá un retardo forzado de tres segundos, se renderizará el interior del tag <cache>
mostrando la hora actual, y el resultado será almacenado en memoria durante 30 segundos.Si volvemos a acceder a la misma vista durante esos 30 segundos, el resultado será mostrado inmediatamente (sin esperar los tres segundos) y el cliente recibirá el contenido que se cacheó durante la primera visita. Al transcurrir este plazo, en la siguiente petición se volverá a procesar el contenido del tag helper, ejecutándose la espera y volviendo a generar y cachear el resultado enviado al cliente.
Pero podemos tener ejemplos algo más complejos, como el siguiente. En el interior del tag helper hemos insertado un view component que podría mostrar las últimas noticias obtenidas de una base de datos, en lo que podría ser la página de inicio de un servicio de información on-line:
<section>
<h1>Latest news</h1>
<cache expires-after="@TimeSpan.FromSeconds(30)">
<vc:latest-news></vc:latest-news>
<p>
Updated at: @DateTime.UtcNow.ToLongTimeString()
</p>
</cache>
</section>
Fijaos que en este caso el tiempo de invalidación del contenido almacenado en caché no tendría sentido que fuera periódico: ¿para qué invalidar la caché y volver a obtener las noticias de la base de datos cada X segundos si quizás no se ha introducido ninguna nueva desde la última vez que se renderizó la página? ¿No sería mejor recargar la caché sólo cuando se hayan modificado las noticias?
lunes, 18 de febrero de 2019
Ahí van los enlaces recopilados durante la semana pasada. Espero que os resulten interesantes. :-)
Por si te lo perdiste...
- Usar Razor desde una aplicación de consola .NET Core (1 de 2)
José María Aguilar - C#: Desmitificando las expresiones lambda (I)
José María Aguilar
.NET / .NET Core
- Adapting Projects to Use C# 8 and Nullable Reference Types
Jonathan Allen - NullableAttribute and C# 8
Jon Skeet - Instantiating a C# object from a string using Activator.CreateInstance in .NET
Jeremy Lindsay - Asynchronous Injection
Mark Seemann - Automating .NET Core Services with PostSharp and Aspect-Oriented Code
Alexander Johnston - Readonly ref variables, in parameters and readonly structs
Konrad Kokosa - Size of struct and size of class in .NET
Jiří Činčura - Using declarations in C# 8.0
Gunnar Peipman - Hunting .NET memory leaks with Windbg
André Snede Kock - An Exhausting List of Differences Between VB.NET & C#
Anthony D. Green - Simple Transaction: Microservices sample architecture for .Net Core Application
John-Ph - VB.NET Popularity Still Rising
David Ramel - When to use C# LINQ with Query Syntax over Method Syntax
Michael Shpilt - C# 8: slicing with Indexes and Ranges
Dawid Sibiński - How many keywords I can fit into a single C# expression? – results
Jiří Činčura - Dependency injection in .NET Core console applications
Gunnar Peipman