Entradas

Mostrando las entradas con la etiqueta C#

C#: Registrar las dependencias de un módulo usando extensiones

Imagen
ASP.NET permite configurar la inyección de dependencias en el Startup.cs . En UBIK , por ejemplo, registramos nuestras dependencias en el método Configure : Esta es la forma estándar y la que se aprende primero, pero tiene varias desventajas: Quien vaya a usar el módulo debe conocer todas sus dependencias y registrarlas en el Startup.cs . Todas las interfaces y las implementaciones deben ser públicas. Alguien podría solicitar una instancia de ICubeStore , cuando lo correcto es acceder a través de ICubeService . Crear nuevos servicios implica modificar el Startup.cs para registrar las dependencias. Por eso en AnniQ intentamos algo distinto y creamos una extensión para IServiceCollection dentro de cada módulo, que le permite "registrarse a sí mismo".   Esta estrategia cubre las desventajas de la implementación anterior: Quien vaya a usar el módulo sólo debe importar y utilizar la extensión IServiceCollection.RegisterUploadModule en Startup.cs . Sólo las interfaces de cierto...

Este no es un artículo sobre DDD

Hace poco publiqué en twitter dos mensajes sobre la relación entre Domain Driven Design y la fase de análisis o diseño que siempre nos recalcaron en la universidad: DDD es la parte de la programación orientada a objetos en la que más énfasis nos hicieron durante la Universidad, pero que olvidamos por andar pensando en entregar rápido. Ahora toca estudiarla otra vez, para arreglar el despelote que también nos advirtieron que íbamos a armar. En esa época tenía un nombre menos fancy: le llamaban análisis. Con variantes como “divide y vencerás”, “primero resuelve el problema y luego escribe el código”, “identifica el contexto”, etc.   Yo no soy experto en DDD -lo escuché por primera vez en septiembre de 2019-, pero después de estudiarlo un poco vi que muchos de los conceptos ya los conocía. Empezaron a encajar en vacíos que tenía en mi código y caí en cuenta que había cometido muchos errores en la fase de diseño. El principal de ellos: no dedicar suficiente tiempo a identificar ...

Mis indispensables de C#. Parte 3: Configuraciones

Esta es una serie de 3 artículos cortos sobre características de C# que uso en todas mis aplicaciones. Configurar el serializador de JSON Cuando quiero usar la misma configuración en toda la aplicación, creo mi propio serializador. Este esquema me permitió migrar fácilmente desde Newtonsoft.Json a System.Text.Json. Reconocimiento especial al método ToHttpJsonContent()... parece que .NET 5 va a incluir extensiones al HttpClient que ayudan a eso. using System.Net.Http ; using System.Text ; using System.Text.Json ; namespace MyApplication.Helpers { public static class JsonGenerator { public static readonly JsonSerializerOptions serializerOptions = new JsonSerializerOptions { PropertyNamingPolicy = JsonNamingPolicy . CamelCase }; public static readonly JsonSerializerOptions deserializerOptions = new JsonSerializerOptions { PropertyNameCaseInsensitive = true }; ...

Mis indispensables de C#. Parte 2: Extensiones

Esta es una serie de 3 artículos cortos sobre características de C# que uso en todas mis aplicaciones. Extensiones… Muchas extensiones Me gusta usar extension methods para validaciones. Aquí hay algunas básicas. public static class ValueExtensions { public static string ThrowIfEmpty ( this string value ) { return string . IsNullOrWhiteSpace ( value ) ? throw new ArgumentNullException () : value . Trim (); } public static string TrimOrThrow ( this string value ) { return value ?. Trim () ?? throw new ArgumentNullException (); } public static Guid ThrowIfEmpty ( this Guid value ) { return value == Guid . Empty ? throw new ArgumentNullException () : value ; } public static DateTime ThrowIfInPast ( this DateTime value ) { return value <= DateTime . Now ? throw new...

Mis indispensables de C#. Parte 1

Esta es una serie de 3 artículos cortos sobre características de C# que uso en todas mis aplicaciones... aunque este en particular empieza con una nueva. Switch expressions Las switch expressions son mi característica favorita de C# 8. Ayudan a asignar valores rápidamente y las uso mucho para renderizar la interfaz gráfica. Supongamos una Partial View que muestra el nombre de una empresa, consultor o institución, y un botón de color distinto para cada caso. @model MyViewModel @ { var ( title , color ) = Model . RoleType switch { RoleType . Company => ( "Empresa" , "info" ), RoleType . Institution => ( "Institución" , "primary" ), RoleType . Mentor => ( "Consultor" , "warning" ), _ => ( "?" , "danger" ) }; } < h3 > @Model . Name </ h3 > < button class =" btn btn - @color "> ...