问题描述
我具有以下活动功能:
[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
解决方法
-
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用于静态方法参数。
我设法解决它,不得不从协调器传递一个上下文对象-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");
}
谢谢