Azure函数->无法将IServiceProvider或IFunctionsHostBuilder注入工厂类构造函数

问题描述

我指的是this链接,该链接解释了如何在Azure功能中实现DI。我想实现一个Factory模式,其中我的Factory class应该能够在构造工厂对象时解决其他依赖关系。

这是代码

public class Startup : Functionsstartup
{
    public override void Configure(IFunctionsHostBuilder builder)
    {

        System.Console.WriteLine("***************************I am in startup....");
        builder.Services.AddScoped<PayloadProcessorFactory>();
        
        /*  I tried to explicitly add IFunctionsHostBuilder to Services but its not working.
            builder.Services.AddScoped<IFunctionsHostBuilder>((s) =>{
            System.Console.WriteLine("test");                
            return builder;
        });*/

        /*No problem with below two dependencies and are getting injected without any issue*/
        builder.Services
        .AddScoped<IPayloadProcessor,DoctorPayloadProcessor>()
        .AddScoped<DoctorPayloadProcessor>();

        builder.Services
        .AddScoped<IPayloadProcessor,PatientPayloadProcessor>()
        .AddScoped<PatientPayloadProcessor>();
    }
}

这是我的工厂班级

public class PayloadProcessorFactory
{
    private readonly IFunctionsHostBuilder builder;
    private readonly ILogger _logger;
    public PayloadProcessorFactory(IFunctionsHostBuilder builder,ILogger<PayloadProcessorFactory> logger)
    {
        _logger = logger;
       this.builder = builder; //Builder is always null
       _logger.LogDebug("Constructing PayloadProcesorFactory");
    }
}

在上面的代码中, builder 的值始终为 null ,因此我无法使用以下语句来解决依赖项

payloadProcessor = builder.Services.BuildServiceProvider()
                .GetrequiredService<DoctorPayloadProcessor>();

Startup.cs中,我试图将IFunctionsHostBuilder显式添加service collection中,但是之后,我遇到了以下问题。

Exception has occurred: CLR/system.invalidOperationException
An exception of type 'system.invalidOperationException' occurred in Microsoft.Extensions.DependencyInjection.dll but was not handled in user code: 'Unable to resolve service for type 'Microsoft.Azure.WebJobs.Script.IEnvironment' while attempting to activate 'Microsoft.Azure.WebJobs.Script.Configuration.ScriptHostOptionsSetup'.'

问题 如何将IServiceProvider注入我的工厂类中以构建复杂的对象并解决多个依赖关系?

项目详细信息

  • Dotnet框架-netcoreapp2.1
  • Azure函数版本:2.0

解决方法

这是.NET Core中带有DI的工厂模式的示例。 您不需要注入服务提供商来解析类。

示例工厂界面

public interface IFactory
{
    IWorker Create(WorkerType workerType);
}

工厂实施示例

public class Factory: IFactory
{
    private readonly IEnumerable<IWorker> _workers;

    public AuthenticationEngineFactory(IEnumerable<IWorker> workers)
    {
        _workers = workers;
    }

    public IWorker Create(WorkerType workerType)
    {
        var worker = _workers.FirstOrDefault(x => x.WorkerType == workerType);
        if (worker is null) throw new System.ArgumentException($"Worker with type '{workerType}' is not supported.");
        return worker;
    }
}

示例工作人员界面

public interface IWorker
{
    WorkerType WorkerType { get; } // This can be an enum.
    void DoWork();
}

示例工作程序实现。

public class Worker1Implementation : IWorker
{
     public WorkerType WorkerType => WorkerType.WorkerType1;

     public void DoWork() {}; // Add implementation
}

public class Worker2Implementation : IWorker
{
     public WorkerType WorkerType => WorkerType.WorkerType2;

     public void DoWork() {}; // Add implementation
}

在您的函数Startup.cs

builder.Services.AddSingleton<IFactory,Factory>();
builder.Services.AddScoped<IWorker,Worker1Implementation>();
builder.Services.AddScoped<IWorker,Worker2Implementation>();