Функция C # Azure v3 Внедрение зависимостей - сканирование сборки с помощью Scrutor - PullRequest
1 голос
/ 24 октября 2019

Я пытаюсь использовать внедрение зависимостей с функциями Azure v3. Я использовал подход Startup, рекомендованный Microsoft в следующей статье: -

https://docs.microsoft.com/en-us/azure/azure-functions/functions-dotnet-dependency-injection

Событие запускается правильно, и это здорово. Затем я вызываю помощника по разрешению зависимостей, который я использую для нескольких типов проектов.

Я использую Scrutor для сканирования сборок, поэтому мне не нужно вручную добавлять каждый интерфейс в класс (AddTransient и т. Д.). Это прекрасно работает в проекте ASP.NET Core Web API, но совсем не работает с функцией Azure. Мои зависимости решения вообще не добавляются.

У меня такой код: -

    public static void AddSolutionServices(this IServiceCollection services)
    {
        services.Scan(scan => scan
            .FromCallingAssembly()
            .FromApplicationDependencies()
            .AddClasses(classes => classes.Where(types => types.FullName.StartsWith("MyNamespace.")))
            .UsingRegistrationStrategy(RegistrationStrategy.Append)
            .AsMatchingInterface()
            .WithTransientLifetime()
        );
    }

Я впервые пытался написать функцию Azure, поэтому я 'Интересно, нельзя ли использовать сканирование сборки с этим типом приложения. Любая помощь будет оценена!

Спасибо

1 Ответ

0 голосов
/ 29 октября 2019

Спасибо за совет @ HariHaran.

Я пытался использовать Autofac и смог заставить его работать с моим проектом ASP .NET Core 3.0 Web API. Сканирование сборки, предоставленное Autofac, не работало, поэтому мне пришлось прибегнуть к сканированию вызывающей сборки для поиска моих собственных библиотек DLL. Я не смог добавить пакет NuGet, который вы упомянули в комментарии (AzureFunctions.Autofac), потому что между ним и Autofac.Extensions.DependencyInjection возник конфликт версий.

С новым сканированием сборки, которое мне удалось выполнить дляописанный выше процесс Autofac, затем я предпринял еще одну попытку со встроенным контейнером .NET Core и Scrutor. Это вспомогательный метод, который мне удалось создать - он работает как с проектом веб-API, так и с функцией Azure: -

Класс запуска для функции Azure

using Microsoft.Azure.Functions.Extensions.DependencyInjection;
using Microsoft.Extensions.DependencyInjection;

[assembly: FunctionsStartup(typeof(MyNamespace.Gateway.Queue.Function.Startup))]
namespace MyNamespace.Gateway.Queue.Function
{
    public class Startup : FunctionsStartup
    {
        public override void Configure(IFunctionsHostBuilder builder)
        {
            builder.Services.AddSolutionServices();
        }
    }
}

DI Helper, используемый веб-API и функцией Azure

using Scrutor;
using System.Collections.Generic;
using System.IO;
using System.Reflection;

namespace Microsoft.Extensions.DependencyInjection
{
    public static class DotNetCoreBootstrapper
    {
        public static void AddSolutionServices(this IServiceCollection services)
        {
            string path = Path.GetDirectoryName(Assembly.GetCallingAssembly().Location);
            List<Assembly> assemblies = new List<Assembly>();
            foreach (string dll in Directory.GetFiles(path, "MyNamespace*.dll"))
            {
                assemblies.Add(Assembly.LoadFrom(dll));
            }

            services.Scan(scan => scan
                .FromAssemblies(assemblies)
                .AddClasses(classes => classes.Where(types => 
types.FullName.StartsWith("MyNamespace.")))
                .UsingRegistrationStrategy(RegistrationStrategy.Append)
                .AsMatchingInterface()
                .WithTransientLifetime()
            );
        }
    }
}
...