{"id":1073,"date":"2019-04-25T08:07:01","date_gmt":"2019-04-25T08:07:01","guid":{"rendered":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?p=1073"},"modified":"2019-04-25T08:07:01","modified_gmt":"2019-04-25T08:07:01","slug":"azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos","status":"publish","type":"post","link":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/","title":{"rendered":"Azure Functions y Dependency Injection con Autofac: Juntos pero no revueltos"},"content":{"rendered":"<p><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-1088\" src=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2019\/04\/Azure-Functions.jpg\" alt=\"\" width=\"628\" height=\"459\" srcset=\"https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2019\/04\/Azure-Functions.jpg 628w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2019\/04\/Azure-Functions-300x219.jpg 300w, https:\/\/encaminablogs.wpenginepowered.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2019\/04\/Azure-Functions-610x446.jpg 610w\" sizes=\"auto, (max-width: 628px) 100vw, 628px\" \/><\/p>\n<p>El mundo de Serverless mola mogoll\u00f3n \u00bfqui\u00e9n no lo ha probado alguna vez? \u00bfTe has visto en la tesitura de aplicar buenas pr\u00e1cticas como la inyecci\u00f3n de dependencias en tus <strong>Azure Functions<\/strong> y has visto que se te complica la vida? Pues con este post ver\u00e1s que es muy sencillo aplicar este concepto.<\/p>\n<p><!--more--><\/p>\n<h2>Lo primero, c\u00f3mo acceder a nuestra configuraci\u00f3n v\u00eda inyecci\u00f3n de dependencias.<\/h2>\n<p>En Asp .Net Core tenemos una cosa muy chula que es poder acceder a nuestra configuraci\u00f3n e inyectarla por DI v\u00eda interfaz <strong>IConfiguration<\/strong>. Esto lo podemos realizar de una forma muy sencilla desde nuestra clase <strong>Startup.cs<\/strong>, ya que viene como par\u00e1metro nuestro amado <strong>IConfiguration.<\/strong><\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">  \r\npublic partial class Startup\r\n{\r\n\tpublic IConfiguration Configuration { get; }\r\n\tprivate IHostingEnvironment Environment { get; }\r\n\t\t   \r\n\tpublic Startup(IConfiguration configuration, IHostingEnvironment environment)\r\n\t{\r\n\t\tConfiguration = configuration;\r\n\t\tEnvironment = environment;\r\n\t}         \r\n\t\t\t \r\n . . . . . . .\r\n}\r\n<\/pre>\n<p>\u00bfC\u00f3mo podemos hacer esto en una <strong>Azure Function<\/strong>? No vemos en ning\u00fan sitio que el m\u00e9todo de inicializaci\u00f3n tenga un <strong>IConfiguration<\/strong> como par\u00e1metro.<br \/>\nLo primero, ser\u00e1 crearnos un servicio para recuperar la variable de entorno <strong>ASPNETCORE_ENVIRONMENT<\/strong>.<\/p>\n<p>Dicho servicio emplea la siguiente clase est\u00e1tica de constantes.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">  \r\nnamespace MyFunctions.Common\r\n{\r\n    public static partial class Constants\r\n    {\r\n        public static class Environments\r\n        {\r\n            public static string Production =&gt; &quot;Production&quot;;\r\n        }\r\n\r\n        public static class EnvironmentVariables\r\n        {\r\n            public static string AspnetCoreEnvironment =&gt; &quot;ASPNETCORE_ENVIRONMENT&quot;;\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Ahora toca codificar nuestro servicio de Environments<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">  \r\nusing System;\r\nusing static MyFunctions.Common.Constants;\r\n\r\nnamespace MyFunctions.Common\r\n{\r\n    public interface IEnvironmentService\r\n    {\r\n        string EnvironmentName { get; set; }\r\n    }\r\n\r\n    public class EnvironmentService : IEnvironmentService\r\n    {\r\n        public EnvironmentService()\r\n        {\r\n            EnvironmentName = Environment.GetEnvironmentVariable(EnvironmentVariables.AspnetCoreEnvironment) ?? Environments.Production;\r\n        }\r\n\r\n        public string EnvironmentName { get; set; }\r\n    }\r\n}\r\n<\/pre>\n<p>Una vez hecho esto, se procede a crear el servicio que nos devuelve ya la configuraci\u00f3n (de regalo os pongo ejemplito de acceder a nuestros secretos v\u00eda <strong>Azure Key Vault<\/strong>).<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">  \r\nusing Microsoft.Extensions.Configuration;\r\n\r\nnamespace MyFunctions.Common\r\n{\r\n    public interface IConfigurationService\r\n    {\r\n        IConfiguration GetConfiguration();\r\n    }\r\n\r\n    public class ConfigurationService : IConfigurationService\r\n    {\r\n        public IEnvironmentService EnvService { get; }\r\n\r\n        public ConfigurationService(IEnvironmentService envService)\r\n        {\r\n            EnvService = envService;\r\n        }\r\n         \r\n        public IConfiguration GetConfiguration()\r\n        {\r\n            return Globals.GetConfiguration();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>\u00bfY qu\u00e9 es eso de <strong>Globals<\/strong>? Pues lo que ver\u00e9is a continuaci\u00f3n.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">  \r\nusing Microsoft.Azure.KeyVault;\r\nusing Microsoft.Azure.Services.AppAuthentication;\r\nusing Microsoft.Azure.WebJobs;\r\nusing Microsoft.Extensions.Configuration;\r\nusing Microsoft.Extensions.Configuration.AzureKeyVault;\r\nusing System.IO;\r\n\r\nnamespace MyFunctions.Common\r\n{\r\n    public static class Globals\r\n    {\r\n        private static IConfigurationBuilder builder;\r\n               \r\n        public static IConfiguration GetConfiguration(ExecutionContext executionContext)\r\n        {\r\n            return GetConfiguration(executionContext.FunctionAppDirectory);\r\n        }\r\n\r\n        public static IConfiguration GetConfiguration()\r\n        {\r\n            return GetConfiguration(Directory.GetCurrentDirectory());\r\n        }\r\n\r\n        static IConfiguration GetConfiguration(string basePath)\r\n        {\r\n            if (builder == null)\r\n            {\r\n                builder = new ConfigurationBuilder()\r\n                 .SetBasePath(basePath)\r\n                 .AddJsonFile(&quot;local.settings.json&quot;, optional: true, reloadOnChange: true)\r\n                 .AddEnvironmentVariables();\r\n\r\n                var config = builder.Build();\r\n                var keyVaultEndpoint = config&#x5B;&quot;KeyVaultUri&quot;];\r\n                \r\n                \/\/ Aqu\u00ed accedemos a nuestro Azure Key Vault, ol\u00e9!\r\n                if (!string.IsNullOrEmpty(keyVaultEndpoint))\r\n                {\r\n                    var azureServiceTokenProvider = new AzureServiceTokenProvider();\r\n                    var keyVaultClient = new KeyVaultClient(\r\n                        new KeyVaultClient.AuthenticationCallback(\r\n                            azureServiceTokenProvider.KeyVaultTokenCallback));\r\n\r\n                    builder.AddAzureKeyVault(\r\n                        keyVaultEndpoint, keyVaultClient, new DefaultKeyVaultSecretManager());\r\n                } \r\n            }\r\n\r\n            return builder.Build();\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<p>Bien, ya casi lo tenemos. En las <strong>Azure Functions<\/strong> tenemos una clase <strong>WebJobsStartup.cs<\/strong> que es el punto de entrada de nuestro c\u00f3digo Serverles.<br \/>\nNOTA: Descargad el paquete Nuget <a href=\"https:\/\/www.nuget.org\/packages\/Willezone.Azure.WebJobs.Extensions.DependencyInjection\">Willezone.Azure.WebJobs.Extensions.DependencyInjection<\/a> para usar un m\u00e9todo de extensi\u00f3n y poder aplicar la carga de la inyecci\u00f3n de dependencias.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">  \r\nusing Microsoft.Azure.WebJobs;\r\nusing Microsoft.Azure.WebJobs.Hosting;\r\nusing Microsoft.Extensions.Configuration;\r\nusing Microsoft.Extensions.DependencyInjection;\r\nusing MyFunctions;\r\nusing MyFunctions.Common;\r\nusing Willezone.Azure.WebJobs.Extensions.DependencyInjection;\r\n\r\n&#x5B;assembly: WebJobsStartup(typeof(Startup))]\r\nnamespace MyFunctions\r\n{\r\n    internal class Startup : IWebJobsStartup\r\n    { \r\n        public void Configure(IWebJobsBuilder builder) =&gt;\r\n            builder.AddDependencyInjection(ConfigureServices);\r\n \r\n        private static void ConfigureServices(IServiceCollection services)\r\n        {\r\n            services.AddTransient&lt;IEnvironmentService, EnvironmentService&gt;();\r\n            services.AddTransient&lt;IConfigurationService, ConfigurationService&gt;();\r\n\r\n            var serviceProvider = services.BuildServiceProvider();\r\n            var configurationtionService = serviceProvider.GetService&lt;IConfigurationService&gt;();\r\n            var configuration = configurationtionService.GetConfiguration();\r\n\r\n            \/\/ Quieres Redis?\r\n            services.AddDistributedRedisCache(option =&gt;\r\n            {\r\n                option.Configuration = configuration&#x5B;&quot;RedisUri&quot;];\r\n            });\r\n        }\r\n    }    \r\n}\r\n<\/pre>\n<p>Con esto y un bizcocho, ya tenemos nuestra configuraci\u00f3n disponible en el servicio de DI de nuestras <strong>Azure Functions \ud83d\ude42<\/strong><\/p>\n<h2>Pero&#8230; \u00bfno ibas a hablar de Autofac?<\/h2>\n<p>Ahora viene lo bueno. Podemos usar nuestro contenedor de IoC\/DI favorito (en mi caso Autofac) para gestionar las dependencias.<\/p>\n<p>Como hemos visto en el punto anterior, podemos usar el m\u00e9todo de extensi\u00f3n <strong>AddDependencyInjection<\/strong> utilizado en nuestra clase <strong>WebJobsStartup.cs<\/strong> para pasarle un <strong>IServiceProviderBuilder<\/strong>. El c\u00f3digo resultante queda de la siguiente forma (muy elegante, s\u00ed se\u00f1or):<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">  \r\nusing Microsoft.Azure.WebJobs;\r\nusing Microsoft.Azure.WebJobs.Hosting;\r\nusing MyFunctions;\r\nusing MyFunctions.Common.DI;\r\nusing Willezone.Azure.WebJobs.Extensions.DependencyInjection;\r\n\r\n&#x5B;assembly: WebJobsStartup(typeof(Startup))]\r\nnamespace MyFunctions\r\n{\r\n    internal class Startup : IWebJobsStartup\r\n    { \r\n        public void Configure(IWebJobsBuilder builder) =&gt;\r\n            builder.AddDependencyInjection&lt;AutofacServiceProviderBuilder&gt;();     \r\n    } \r\n}\r\n<\/pre>\n<p>Y la implementaci\u00f3n de <strong>AutofacServiceProviderBuilder <\/strong>queda as\u00ed:<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">  \r\nusing Autofac;\r\nusing Autofac.Extensions.DependencyInjection;\r\nusing AutoMapper;\r\nusing Microsoft.Azure.KeyVault;\r\nusing Microsoft.Azure.KeyVault.Models;\r\nusing Microsoft.Azure.Services.AppAuthentication;\r\nusing Microsoft.Extensions.Configuration;\r\nusing Microsoft.Extensions.DependencyInjection;\r\nusing MyFunctions.Domain.Autofac;\r\nusing MyFunctions.Infrastructure.Autofac;\r\nusing MyFunctions.Services.Autofac;\r\nusing MyFunctions.Shared.Model.Infrastructure;\r\nusing MyFunctions.Shared.Utils.Mapper;\r\nusing System;\r\nusing System.Threading.Tasks;\r\nusing Willezone.Azure.WebJobs.Extensions.DependencyInjection;\r\n\r\nnamespace MyFunctions.Common.DI\r\n{\r\n    public class AutofacServiceProviderBuilder : IServiceProviderBuilder\r\n    {\r\n        public IConfiguration Configuration { get; set; }\r\n\r\n        public AutofacServiceProviderBuilder(IConfiguration configuration) =&gt; Configuration = configuration;\r\n\r\n        public IServiceProvider Build()\r\n        {\r\n            var services = new ServiceCollection();\r\n            services.AddTransient&lt;IEnvironmentService, EnvironmentService&gt;();\r\n            services.AddTransient&lt;IConfigurationService, ConfigurationService&gt;();\r\n\r\n            var serviceProvider = services.BuildServiceProvider();\r\n            var configurationtionService = serviceProvider.GetService&lt;IConfigurationService&gt;();\r\n            Configuration = configurationtionService.GetConfiguration();\r\n\r\n            \/\/ Nuestra configuraci\u00f3n como servicio\r\n            services.AddSingleton&lt;IConfiguration&gt;(Configuration);\r\n            var appSettingsSection = Configuration.GetSection(&quot;AppSettings&quot;);\r\n            services.Configure&lt;AppSettings&gt;(appSettingsSection);\r\n \r\n\t    \/\/ Quieres Redis? \r\n            services.AddDistributedRedisCache(option =&gt;\r\n            {\r\n                option.Configuration = Configuration&#x5B;&quot;RedisUri&quot;];\r\n            });\r\n\r\n            \/\/ Quieres AutoMapper?            \r\n            services.AddAutoMapper(new&#x5B;] { typeof(MappingProfile) });\r\n \r\n            \/\/ Aqu\u00ed inyectamos los m\u00f3dulos Autofac\r\n            var builder = new ContainerBuilder();\r\n\r\n            builder.Populate(services);\r\n\r\n            builder.RegisterModule&lt;InfrastructureModules&gt;();\r\n            builder.RegisterModule&lt;DomainModules&gt;();\r\n            builder.RegisterModule&lt;ServiceModules&gt;();\r\n            builder.RegisterModule&lt;ApplicationServiceModules&gt;();\r\n            builder.RegisterModule&lt;DataModules&gt;(); \r\n\r\n            return new AutofacServiceProvider(builder.Build());\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<h2>Mola lo que has hecho. Ahora \u00bfc\u00f3mo lo aplico en mis funciones?<\/h2>\n<p>Con el sistema de DI a punto, solo queda saber c\u00f3mo hacer para resolver las dependencias en nuestras <strong>Azure Functions<\/strong>.<br \/>\nSencillito, se emplea el atributo <strong>[Inject]<\/strong> en un par\u00e1metro de nuestra Function. Ve\u00e1moslo con un patr\u00f3n de orquestaci\u00f3n para una <strong>Durable Function<\/strong>.<\/p>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">  \r\nusing Microsoft.Azure.WebJobs;\r\nusing Microsoft.Extensions.Logging;\r\nusing System;\r\nusing System.Threading.Tasks;\r\n\r\nnamespace MyFunctions.Functions.ManageTransactions\r\n{\r\n    public static class ManageTransactionsOrchestatorClient\r\n    {\r\n        &#x5B;FunctionName(nameof(ManageTransactionsOrchestatorClient))]\r\n        public static async Task StartOrchestrationAsync(&#x5B;TimerTrigger(&quot;0 0 0 * * *&quot;, RunOnStartup = false)]TimerInfo myTimer,\r\n            &#x5B;OrchestrationClient] DurableOrchestrationClient orchestrationClient, ILogger log)\r\n        {\r\n            log.LogInformation($&quot;{nameof(ManageTransactionsOrchestatorClient) } function executed at: {DateTime.Now}&quot;);\r\n            await orchestrationClient.StartNewAsync(nameof(ManageTransactionsOrchestator), null);\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<pre class=\"brush: csharp; title: ; notranslate\" title=\"\">  \r\nusing Microsoft.Azure.WebJobs;\r\nusing Microsoft.Extensions.Logging;\r\nusing MyFunctions.ApplicationServices.Abstract;\r\nusing MyFunctions.Domain.Abstract;\r\nusing MyFunctions.Shared.Model.Domain;\r\nusing System;\r\nusing System.Collections.Generic;\r\nusing System.Threading.Tasks;\r\nusing Willezone.Azure.WebJobs.Extensions.DependencyInjection;\r\n\r\nnamespace MyFunctions.Functions.ManageTransactions\r\n{\r\n    public static class ManageTransactionsOrchestator\r\n    {\r\n        &#x5B;FunctionName(nameof(ManageTransactionsOrchestator))]\r\n        public static async Task OrchestrateAsync(&#x5B;OrchestrationTrigger] DurableOrchestrationContext context, ILogger log)\r\n        { \r\n            log.LogInformation($&quot;{nameof(ManageTransactionsOrchestator)} function executed at: {DateTime.Now}&quot;);\r\n            var retryOptions = new RetryOptions(TimeSpan.FromSeconds(5), 5);\r\n\r\n            try\r\n            {\r\n                await context.CallActivityWithRetryAsync&lt;bool&gt;(nameof(SendNotification), retryOptions, null);\r\n            }\r\n            catch (FunctionFailedException ex)\r\n            {\r\n                log.LogError(ex, ex.Message);\r\n                throw;\r\n            }\r\n        }\r\n\r\n        &#x5B;FunctionName(nameof(SendNotification))]\r\n        public static async Task&lt;bool&gt; SendNotification(&#x5B;ActivityTrigger] DurableActivityContext context, ExecutionContext executionContext,\r\n                                                        &#x5B;Inject]INotificationHubService notificationHubService) \/\/ Inyectamos el servicio con &#x5B;Inject]\r\n        {\r\n            return await notificationHubService.NotifyAsync(&quot;&quot;, 0, 3);\r\n        }\r\n    }\r\n}\r\n<\/pre>\n<h2>Conclusiones<\/h2>\n<p>En este art\u00edculo hemos visto c\u00f3mo implementar DI en nuestras <strong>Azure Functions<\/strong> de una manera muy sencilla. Por ahora es una soluci\u00f3n que estamos aplicando ya que desgraciadamente en las Functions V2 su sistema de DI <strong>out-of-the-box<\/strong> ha sufrido un peque\u00f1o rev\u00e9s y hasta que lo tengan arreglado, as\u00ed es como podemos solventar el problema.<\/p>\n<p>HAPPY CODING!<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content --><span class=\"et_bloom_bottom_trigger\"><\/span>","protected":false},"excerpt":{"rendered":"<p>El mundo de Serverless mola mogoll\u00f3n \u00bfqui\u00e9n no lo ha probado alguna vez? \u00bfTe has visto en la tesitura de aplicar buenas pr\u00e1cticas como la inyecci\u00f3n de dependencias en tus Azure Functions y has visto que se te complica la &hellip; <a href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":185,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[111],"tags":[],"class_list":["post-1073","post","type-post","status-publish","format-standard","hentry","category-azure-functions"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v18.2.1 (Yoast SEO v28.7) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Azure Functions y Dependency Injection con Autofac: Juntos pero no revueltos | ENCAMINA<\/title>\n<meta name=\"description\" content=\"Sergio Parra nos explica c\u00f3mo implementar DI en nuestras Azure Functions de una manera muy sencilla.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Azure Functions y Dependency Injection con Autofac: Juntos pero no revueltos\" \/>\n<meta property=\"og:description\" content=\"Sergio Parra nos explica c\u00f3mo implementar DI en nuestras Azure Functions de una manera muy sencilla.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/\" \/>\n<meta property=\"og:site_name\" content=\"Piensa en software, desarrolla en colores\" \/>\n<meta property=\"article:published_time\" content=\"2019-04-25T08:07:01+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2019\/04\/Azure-Functions.jpg\" \/>\n<meta name=\"author\" content=\"Sergio Parra Guerra\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Escrito por\" \/>\n\t<meta name=\"twitter:data1\" content=\"Sergio Parra Guerra\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data2\" content=\"7 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\\\/\"},\"author\":{\"name\":\"Sergio Parra Guerra\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/bc314219999e4f7ed909d299efa70f4b\"},\"headline\":\"Azure Functions y Dependency Injection con Autofac: Juntos pero no revueltos\",\"datePublished\":\"2019-04-25T08:07:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\\\/\"},\"wordCount\":1314,\"commentCount\":0,\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2019\\\/04\\\/Azure-Functions.jpg\",\"articleSection\":[\"Azure Functions\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\\\/\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\\\/\",\"name\":\"Azure Functions y Dependency Injection con Autofac: Juntos pero no revueltos | ENCAMINA\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2019\\\/04\\\/Azure-Functions.jpg\",\"datePublished\":\"2019-04-25T08:07:01+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/bc314219999e4f7ed909d299efa70f4b\"},\"description\":\"Sergio Parra nos explica c\u00f3mo implementar DI en nuestras Azure Functions de una manera muy sencilla.\",\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\\\/#primaryimage\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2019\\\/04\\\/Azure-Functions.jpg\",\"contentUrl\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/wp-content\\\/uploads\\\/sites\\\/21\\\/2019\\\/04\\\/Azure-Functions.jpg\",\"width\":628,\"height\":459},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#website\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/\",\"name\":\"Piensa en software, desarrolla en colores\",\"description\":\"Las ventajas que te ofrece Microsoft Azure y el mundo.NET\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/#\\\/schema\\\/person\\\/bc314219999e4f7ed909d299efa70f4b\",\"name\":\"Sergio Parra Guerra\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g\",\"caption\":\"Sergio Parra Guerra\"},\"description\":\"Sergio Parra es Ingeniero T\u00e9cnico en Inform\u00e1tica de Sistemas por la UPSAM. Tiene a sus espaldas much\u00edsimas certificaciones entre las cuales Microsoft Certified Professional y ex Microsoft MVP Visual Studio and Development Technologies. Actualmente es un magn\u00edfico Software &amp; Cloud Architect en ENCAMINA.\",\"url\":\"https:\\\/\\\/blogs.encamina.com\\\/piensa-en-software-desarrolla-en-colores\\\/author\\\/sparra\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Azure Functions y Dependency Injection con Autofac: Juntos pero no revueltos | ENCAMINA","description":"Sergio Parra nos explica c\u00f3mo implementar DI en nuestras Azure Functions de una manera muy sencilla.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/","og_locale":"es_ES","og_type":"article","og_title":"Azure Functions y Dependency Injection con Autofac: Juntos pero no revueltos","og_description":"Sergio Parra nos explica c\u00f3mo implementar DI en nuestras Azure Functions de una manera muy sencilla.","og_url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/","og_site_name":"Piensa en software, desarrolla en colores","article_published_time":"2019-04-25T08:07:01+00:00","og_image":[{"url":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2019\/04\/Azure-Functions.jpg","type":"","width":"","height":""}],"author":"Sergio Parra Guerra","twitter_card":"summary_large_image","twitter_misc":{"Escrito por":"Sergio Parra Guerra","Tiempo de lectura":"7 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/#article","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/"},"author":{"name":"Sergio Parra Guerra","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/bc314219999e4f7ed909d299efa70f4b"},"headline":"Azure Functions y Dependency Injection con Autofac: Juntos pero no revueltos","datePublished":"2019-04-25T08:07:01+00:00","mainEntityOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/"},"wordCount":1314,"commentCount":0,"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2019\/04\/Azure-Functions.jpg","articleSection":["Azure Functions"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/","name":"Azure Functions y Dependency Injection con Autofac: Juntos pero no revueltos | ENCAMINA","isPartOf":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/#primaryimage"},"image":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/#primaryimage"},"thumbnailUrl":"http:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2019\/04\/Azure-Functions.jpg","datePublished":"2019-04-25T08:07:01+00:00","author":{"@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/bc314219999e4f7ed909d299efa70f4b"},"description":"Sergio Parra nos explica c\u00f3mo implementar DI en nuestras Azure Functions de una manera muy sencilla.","inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/azure-functions-y-dependency-injection-con-autofac-juntos-pero-no-revueltos\/#primaryimage","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2019\/04\/Azure-Functions.jpg","contentUrl":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-content\/uploads\/sites\/21\/2019\/04\/Azure-Functions.jpg","width":628,"height":459},{"@type":"WebSite","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#website","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/","name":"Piensa en software, desarrolla en colores","description":"Las ventajas que te ofrece Microsoft Azure y el mundo.NET","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Person","@id":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/#\/schema\/person\/bc314219999e4f7ed909d299efa70f4b","name":"Sergio Parra Guerra","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/secure.gravatar.com\/avatar\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/59ba4f5f51b231ec5a3ce33035eba3ee35017746169421c702972da2f50574c2?s=96&d=mm&r=g","caption":"Sergio Parra Guerra"},"description":"Sergio Parra es Ingeniero T\u00e9cnico en Inform\u00e1tica de Sistemas por la UPSAM. Tiene a sus espaldas much\u00edsimas certificaciones entre las cuales Microsoft Certified Professional y ex Microsoft MVP Visual Studio and Development Technologies. Actualmente es un magn\u00edfico Software &amp; Cloud Architect en ENCAMINA.","url":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/author\/sparra\/"}]}},"_links":{"self":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/1073","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/users\/185"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/comments?post=1073"}],"version-history":[{"count":0,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/posts\/1073\/revisions"}],"wp:attachment":[{"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/media?parent=1073"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/categories?post=1073"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.encamina.com\/piensa-en-software-desarrolla-en-colores\/wp-json\/wp\/v2\/tags?post=1073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}