microsoft - porta azure
DI en Funciones Azure (3)
Hay una solicitud de función abierta en las páginas de GitHub para las funciones de Azure relacionadas con este asunto.
Sin embargo, la forma en que me estoy aproximando a esto es mediante algún tipo de punto de entrada de "envoltura", resuélvalo utilizando el localizador de servicios e inicie la función desde allí.
Esto se parece un poco a esto (simplificado)
var builder = new ContainerBuilder();
//register my types
var container = builder.Build();
using(var scope = container.BeginLifetimeScope())
{
var functionLogic = scope.Resolve<IMyFunctionLogic>();
functionLogic.Execute();
}
Esto es un poco pirateado, por supuesto, pero es lo mejor que hay hasta que lo hay en este momento (que yo sepa).
Tengo algunas bibliotecas de clase que uso en mi aplicación de API web ASP.NET que maneja todas mis cosas de back-end, por ejemplo, operaciones CRUD a múltiples bases de datos como Azure SQL Database, Cosmos DB, etc.
No quiero volver a inventar la rueda y puedo usarlos en las nuevas funciones de Azure que estoy creando en Visual Studio 2017. Todos mis métodos de repositorio usan una interfaz. Entonces, ¿cómo implementaré la inyección de dependencia en mi nueva función de Azure?
No veo ningún apoyo para DI pero estoy un poco confundido. Parece que las Funciones de Azure se basan en el mismo SDK que WebJobs y creo que el año pasado, Microsoft comenzó a admitir DI en WebJobs; lo sé con certeza porque lo implementé utilizando Ninject.
¿Hay alguna forma de evitar esto para poder usar mis bibliotecas existentes en mi nuevo proyecto de Funciones de Azure?
Me gustaría añadir mis 2 centavos. Utilicé la técnica que utiliza Host inyectando ILogger. Si observa el proyecto de inicio, creé GenericBindingProvider que implementa IBindingProvider. Luego, para cada tipo que quiera ser inyectado, lo registro de la siguiente manera:
builder.Services.AddTransient<IWelcomeService, WelcomeService>();
builder.Services.AddSingleton<IBindingProvider, GenericBindingProvider<IWelcomeService>>();
El inconveniente es que necesita registrar dos veces el tipo que desea que se inyecte en la función.
Código de muestra:
Veo estas dos técnicas además del patrón localizador de servicios (anti). También le pedí al equipo de funciones de Azure sus comentarios.
https://blog.wille-zone.de/post/azure-functions-dependency-injection/
https://blog.wille-zone.de/post/azure-functions-proper-dependency-injection/