问题描述
我指的是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>();