Jorge Serrano
  • Home

Inyección de Dependencias en ASP.NET Core – I

  • By jorge
  • Feb-6-2019
  • .NET Core, ASP.NET Core
  • 3 Comments.

Una de las características que nos ofrece .NET Core es la de tener la posibilidad de utilizar el patrón Inyección de Dependencias que nos permitirá hacer la IoC o inversión de control sin tener que utilizar otro software de terceros, lo cuál nos simplifica enormemente las necesidades más generales de la IoC.

No obstante, es posible que alguna de las características del IoC que viene «de serie» en .NET Core se pudiera quedar corta en un momento dado.
Si esto llegara a ser así, tendríamos ahí sí, que buscar una solución diferente a la que nos ofrece out-of-the-box el propio .NET Core, pero casi siempre no será necesario ir a software de terceros.

La magia de todo esto se logra gracias al namespace Microsoft.Extensions.DependencyInjection y a la correspondiente implementación para el soporte por defecto de la inyección por constructor.

Como siempre que utilizamos IoC, lo único que debemos hacer es registrar de alguna manera la interfaz y la implementación a utilizar de forma que al resolverse se haga de forma automática, para luego recuperarla con el objetivo de poder trabajar con ella en la parte de código que tenga la necesidad de utilizarla.

En esta entrada voy a explicar cómo funciona el mecanismo de IoC dentro de una aplicación Web de ASP.NET Core y cómo utilizarla.
Veremos con un ejemplo, un caso de uso típico.

Supongamos que tenemos una interfaz que vamos a hacer muy simple y de cero, y que corresponde con el siguiente código:

public interface ILog
{
    void Write(string message);
}

Ahora supongamos que tenemos la siguiente implementación de la interfaz que hemos preparado:

public class MyLog : ILog
{
    public void Write(string message)
    {
        Debug.WriteLine(message);    
    }
}

Como podemos apreciar, se trata de un ejemplo muy sencillo que escribirá en la ventana Output de Visual Studio el texto que pasemos en el método Write de la implementación de la interfaz.

Dentro de la clase Startup y en concreto en el método public void ConfigureServices(IServiceCollection services) agregaré un servicio definiendo la interfaz y su implementación.

Cabe mencionar antes de continuar que tenemos dos tipos de servicios.
Los servicios propios del Framework, y los servicios de aplicación.

El método ConfigureServices de la clase Startup nos permitirá configurar o registrar los servicios de aplicación.
En el método Configure de la clase Startup crearemos la canalización del procesado de las peticiones de la aplicación, lo que encontrarás en inglés como HTTP request pipeline.
El runtime llamará al iniciar la aplicación a ConfigureServices y Configure.

El contenedor de IoC tendrá que inyectar nuestros servicios de aplicación de forma directa cuando solicitemos su implementación, así que tendremos que registrarlo en el contenedor de IoC de esta forma (en ConfigureServices por lo tanto):

services.Add(new ServiceDescriptor(typeof(ILog), new MyLog()));

Nota: Hay más maneras de añadir las interfaces e implementaciones, pero de momento vamos a verlo de esta forma.

En el código vemos que llamamos a ServiceDescriptor.
ServiceDescriptor nos permite especificar el tipo de servicio y su instancia.
En nuestro caso, el contenedor de IoC creará un Singleton de nuestra clase recuperando la instancia de la clase en la aplicación Web cuando la queramos utilizar.

Así que una vez hecho esto y suponiendo que en el método Configure de la misma clase Startup tenemos definida también la ruta que servirá el controlador y acción, vamos a centrarnos ahora en el controlador.

El código del controlador que he preparado es el siguiente:

public class FooController : Controller
{
    private readonly ILog _log;

    public FooController(ILog log)
    {
        _log = log;
    }

    public IActionResult Index()
    {
        _log.Write("\t Log => Executing /foo/index");

        return View();
    }
}

Atendiendo al código de nuestro controlador, vemos que en el constructor estamos resolviendo la implementación y recuperando la instancia del Singleton que hemos definido en la clase Startup.

El contenedor de IoC resolverá de forma automática la instancia de MyLog al constructor del controlador.

El contenedor IoC se encargará también de gestionar el ciclo de vida de la instancia de tipo ILog que hemos pasado.

Si ejecutamos nuestra aplicación y vamos al controlador/acción que hemos preparado, escribirá en Output de Visual Studio el texto que hemos indicado en la acción.

Llegados a este punto, vemos que el uso de IoC en ASP.NET Core es realmente sencillo y no requiere de excesivos esfuerzos por nuestra parte.

En próximas entradas del blog veremos en algo más de profundidad las diferentes opciones que tenemos en .NET Core a la hora de trabajar con IoC.

Happy Coding!

Comments

3 Responsesso far

  1. Alejandro Jimenez dice:
    19 abril, 2020 a las 1:02 pm

    Buenos días !
    Soy un programador web en crecimiento, aun estoy en la facultad y este tipo de información no nos la enseñan, siendo de suma importancia ya que ahora que trabajo y a la vez estudio, requiero de utilizar inyección de dependencias y no entendía casi en NADA de como se hace y/o que es ese servicio.

    Muchas gracias por tu articulo en verdad es muy sencillo y me esperaba algo mas supercomplejo de entender.

    Responder
  2. Juan Carlos Díazgranados dice:
    18 junio, 2020 a las 9:26 pm

    Hola, muy claro, pero ¿cuál es el escenario adecuado para cada una de las tres opciones que nos ofrece el framework: Por ejemplo en una interface IEmpleado, para un CRUD, cuál sería la más adecuada Singleton, Scoped o Transient?

    Responder
    • ELI ROBERTO DE LA ROSA dice:
      14 septiembre, 2020 a las 4:12 pm

      Hola Juan Carlos, esas opciones que mencionas en realidad son los tiempos de vida de los objetos:
      -Trasient(Transitorio): Se crea una nueva instancia cada vez que se solicite al contenedor. -Scoped: El objeto se crea para cada request y -Singleton: El objeto se creará la primera vez que lo soliciten y vivirá durante todo el tiempo de vida de la aplicación. Ahora tu sabrías cual te funciona de la mejor manera que se adapte a tu aplicación.

      Responder

Deja un comentario Cancelar respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

← Previous Post Next Post →

Jorge Serrano

MVP Reconnect


¡Subscríbete a mi canal!
YouTube

Donaciones
Donation

Entradas recientes

  • Go – Arrays
  • Go – Operators
  • Go – Constants
  • Go – Tipos de Datos
  • Go – Variables
  • Hello Go-rld!
  • Introducción a Go o Golang
  • JSON Patch en ASP.NET Core 5 Web API
  • Null Checking en C#
  • ¿Porqué mi página web por defecto de ASP.NET Core no se vé en mi Azure Web App y me da un 404?

Categorías

  • .NET 5
  • .NET Core
  • .NET Core 3.0
  • .NET Core 3.1
  • .NET Framework 2.0
  • .NET Framework 3.0
  • .NET Framework 3.5
  • .NET Framework 4.0
  • .NET Framework 4.5
  • .NET Framework 4.6
  • .NET Framework 4.7
  • .NET Framework 4.8
  • .NET Standard 2.0
  • .NET Standard 2.1
  • AMQP
  • Android
  • Angular
  • API REST
  • Apple
  • Apple iOS
  • Apple macOs
  • Arquitectura
  • ASP.NET
  • ASP.NET Core
  • ASP.NET Core 3
  • ASP.NET Core 5
  • AWS
  • Azure App Service
  • Azure Application Insights
  • Azure Cosmos DB
  • Azure Database Migration Service
  • Azure Databricks
  • Azure DevOps
  • Azure Event Grid
  • Azure Functions
  • Azure IoT
  • Azure Portal
  • Azure PowerShell
  • Azure Queue Storage
  • Azure SQL
  • Azure Storage
  • Azure Virtual Datacenter
  • Azure WebApps
  • Big Data
  • Bing
  • Blazor
  • Blog
  • Bots
  • C#
  • C# 7.0
  • C# 7.1
  • C# 7.2
  • C# 7.3
  • C# 8.0
  • C# 9.0
  • Channel 9
  • Codeplex
  • Codespaces
  • Containers
  • Debugging
  • DevOps
  • Docker
  • Electron
  • Entity Framework
  • Entity Framework Core
  • Entity Framework Core 3.0
  • Entity Framework Core 5
  • Eventos
  • F#
  • FaaS
  • FeatureFlags
  • FeatureToggles
  • Feeds
  • Fluent Assertions
  • General
  • GIMP
  • Git
  • GitHub
  • Go
  • Google
  • Google Analytics
  • Gradle
  • gRPC
  • GSA
  • Historia de la Informática
  • HoloLens
  • HtmlAgilityPack
  • IdentityServer4
  • Inkscape
  • Ionic
  • iOS
  • IoT
  • Java
  • JavaScript
  • JDBC
  • JSON
  • Kubernetes
  • Lenguajes de Programación
  • Libros y Cursos
  • LINQ
  • Linux
  • LiteDB
  • Machine Learning
  • macOS
  • Microservices
  • Microsoft
  • Microsoft .NET Framework 4.5
  • Microsoft 365
  • Microsoft Azure
  • Microsoft Build
  • Microsoft Ignite
  • Microsoft Learn
  • Microsoft Orleans
  • Microsoft Surface Go
  • Microsoft Teams
  • ML.NET
  • MQTT
  • MRO
  • MS-DOS
  • MsCoders Madrid
  • MVP
  • NancyFx
  • Node.js
  • NoSQL
  • NuGet
  • NUnit
  • OData
  • ODP.NET Core
  • Office 2007
  • Office 2010
  • Office 2013
  • Office 2016
  • Office 2019
  • Office 365
  • Open Source
  • Open XML SDK
  • Opinión
  • Orchard CMS
  • OT
  • PaaS
  • Patterns
  • PdfSharpCore
  • Performance
  • PHP
  • Postman
  • Power BI
  • PowerShell
  • PowerShell Core
  • Productividad
  • Project Server 2019
  • R
  • Rendimiento
  • Scala
  • Scraper
  • Security
  • Serverless
  • Service Fabric
  • SharePoint Server 2019
  • SignalR
  • Sin categoría
  • Sistemas Distribuidos
  • Skype
  • Skype for Business Server 2019
  • Small Basic Online
  • SQL Server 2005
  • SQL Server 2008
  • SQL Server 2012
  • SQL Server 2014
  • SQL Server 2016
  • SQL Server 2017
  • SQL Server 2019
  • STOMP
  • Swagger
  • Testing
  • TFS 2017
  • TFS 2018
  • Tools
  • TypeScript
  • Unity
  • UWP
  • UX
  • Visio
  • Visual Basic
  • Visual Studio 2010
  • Visual Studio 2012
  • Visual Studio 2013
  • Visual Studio 2015
  • Visual Studio 2017
  • Visual Studio 2017 for Mac
  • Visual Studio 2019
  • Visual Studio 2019 for Mac
  • Visual Studio App Center
  • Visual Studio Code
  • Visual Studio IntelliCode
  • Visual Studio Live Share
  • Visual Studio Live Share Audio
  • Visual Studio Online
  • VS Anywhere
  • Vue.js
  • Web API
  • WebAssembly
  • WinDbg
  • Windows
  • Windows 10
  • Windows Compatibility Pack
  • Windows Phone 10
  • Windows Phone 7
  • Windows Phone 8
  • Windows Server 2008
  • Windows Server 2012
  • Windows Server 2016
  • Windows Server 2019
  • Windows Service
  • WinForms
  • WinUI
  • WPF
  • Xamarin
  • Xbox
  • Xcode
  • Xiaomi Mi Band 2
  • xUnit
  • YAML

Archivos

  • enero 2021
  • diciembre 2020
  • noviembre 2020
  • octubre 2020
  • septiembre 2020
  • agosto 2020
  • julio 2020
  • junio 2020
  • mayo 2020
  • abril 2020
  • marzo 2020
  • febrero 2020
  • enero 2020
  • diciembre 2019
  • noviembre 2019
  • octubre 2019
  • septiembre 2019
  • agosto 2019
  • julio 2019
  • junio 2019
  • mayo 2019
  • abril 2019
  • marzo 2019
  • febrero 2019
  • enero 2019
  • diciembre 2018
  • noviembre 2018
  • octubre 2018
  • septiembre 2018
  • agosto 2018
  • julio 2018
  • junio 2018
  • mayo 2018
  • abril 2018
  • marzo 2018
  • febrero 2018
  • enero 2018
  • diciembre 2017
  • noviembre 2017
  • octubre 2017
  • septiembre 2017
  • agosto 2017
  • julio 2017
  • junio 2017
  • febrero 2015
  • octubre 2014
  • junio 2014
  • marzo 2014
  • febrero 2014
  • enero 2014
  • diciembre 2013
  • septiembre 2013
  • agosto 2013
  • julio 2013
  • junio 2013
  • abril 2013
  • febrero 2013
  • enero 2013
  • diciembre 2012
  • noviembre 2012
  • septiembre 2012
  • agosto 2012
  • junio 2012
  • mayo 2012
  • abril 2012
  • marzo 2012
  • febrero 2012
  • enero 2012
  • diciembre 2011
  • noviembre 2011
  • octubre 2011
  • septiembre 2011
  • agosto 2011
  • julio 2011
  • junio 2011
  • mayo 2011
  • abril 2011
  • marzo 2011
  • enero 2011
  • diciembre 2010
  • noviembre 2010
  • octubre 2010
  • septiembre 2010
  • agosto 2010
  • julio 2010
  • junio 2010
  • mayo 2010
  • abril 2010
  • marzo 2010
  • febrero 2010
  • enero 2010
  • diciembre 2009
  • noviembre 2009
  • octubre 2009
  • septiembre 2009
  • agosto 2009
  • julio 2009
  • junio 2009
  • mayo 2009
  • abril 2009
  • marzo 2009
  • febrero 2009
  • enero 2009
  • diciembre 2008
  • noviembre 2008
  • octubre 2008
  • septiembre 2008
  • agosto 2008
  • julio 2008
  • junio 2008
  • mayo 2008
  • abril 2008
  • marzo 2008
  • febrero 2008
  • enero 2008
  • diciembre 2007
  • noviembre 2007
  • octubre 2007
  • septiembre 2007
  • agosto 2007
  • julio 2007
  • junio 2007
  • mayo 2007
  • abril 2007
  • marzo 2007
  • febrero 2007
  • enero 2007
  • diciembre 2006
  • noviembre 2006
  • octubre 2006
  • septiembre 2006
  • agosto 2006
  • julio 2006
  • junio 2006
  • mayo 2006
About This Site

A cras tincidunt, ut tellus et. Gravida scel ipsum sed iaculis, nunc non nam. Placerat sed phase llus, purus purus elit.

Archives Widget
  • January 2010
  • December 2009
  • November 2009
  • October 2009
Categories
  • Entertainment
  • Technology
  • Sports & Recreation
  • Jobs & Lifestyle
Search
  • twitter

Powered by WordPress  |  Business Directory by InkThemes.

This site uses cookies: Find out more.