我具有以下活动功能:
[FunctionName("LoadSubscriptionAnalytics_Activity")]
public static async Task<IActionResult> RunActivity([ActivityTrigger] ILogger log
)
{
log.LogInformation("Activity function");
}
Log.LogInformation失败,并出现错误:值不能为null。 (参数“记录器”)
记录器可用于我的协调器功能:
[FunctionName("LoadSubscriptionAnalytics_Orchestrator")]
public static async Task<List<Task<IActionResult>>> RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context, ILogger log)
{
var outputs = new List<Task<IActionResult>>();
log.LogInformation("Orchestrator function");
outputs.Add(await context.CallActivityAsync<Task<IActionResult>>("LoadSubscriptionAnalytics_Activity", null));
return outputs;
}
为什么此依赖项注入无效? 我正在使用带有.Net Core 3.1的Functions V2
答案 0 :(得分:0)
LogInformation
是ILogger
中定义的Microsoft.Extensions.Logging.Abstractions.dll
的扩展方法。
因为它是扩展方法而不是 real 实例方法,所以在调用它时,它与static
方法调用相同,并且.NET运行时将不检查主题/实例引用是否为null
-因此您不要得到NullReferenceException
。
可能有用,实际上-我有自己的实用程序库,具有String.IsNullOrWhiteSpace
语法上简洁的扩展方法:
// Declaration:
public static Boolean IsSet( this String str ) => !String.IsNullOrWhiteSpace( str ):
// Usage:
String x = null;
Console.WriteLine( x.IsSet() ); // Prints "false" with no NullReferenceException
因此,在您的情况下,运行log.LogInformation("Activity function");
时,log
的{{1}}参数为RunActivity
。
我假设null
是可选的-因此请使用log
绕行它-或如果需要,则抛出自己的?.
异常:
ArgumentNullException
[FunctionName("LoadSubscriptionAnalytics_Activity")]
public static async Task<IActionResult> RunActivity( [ActivityTrigger] ILogger log )
{
log?.LogInformation("Activity function");
}
[FunctionName("LoadSubscriptionAnalytics_Activity")]
public static async Task<IActionResult> RunActivity( [ActivityTrigger] ILogger log )
{
if( log is null ) throw new ArgumentNullException( nameof(log) );
log.LogInformation("Activity function");
}
参数的参数首先是log
-您是否在null
中正确配置了DI容器?我承认我不太熟悉Azure耐用函数-但在.NET中,一般来说,DI仅针对构造函数而不是静态方法进行设置-尽管某些环境允许DI用于静态方法参数。答案 1 :(得分:0)
我设法解决它,不得不从协调器传递一个上下文对象-IDurableOrchestrationContext上下文,以便活动功能可以将其检测为参数。我的代码是:
编排器
[FunctionName("LoadSubscriptionAnalytics_Orchestrator")]
public static async Task<List<Task<IActionResult>>> RunOrchestrator(
[OrchestrationTrigger] IDurableOrchestrationContext context, ILogger log)
{
var outputs = new List<Task<IActionResult>>();
log = context.CreateReplaySafeLogger(log);
log.LogInformation("Calling LoadSubscriptionAnalytics_Activity");
outputs.Add(await context.CallActivityAsync<Task<IActionResult>>("LoadSubscriptionAnalytics_Activity", context));
log.LogInformation("Done !");
return outputs;
}
活动
[FunctionName("LoadSubscriptionAnalytics_Activity")]
public static async Task<IActionResult> RunActivity([ActivityTrigger] IDurableActivityContext activityContext, ILogger log
)
{
//This works
log.LogInformation("Activity function");
}
谢谢