One approach is a technique called Partial Application. It lets you partially apply N parameters from left to right – leaving you with a new and reduced function. Partial application is possible due to currying. In many functional programming languages a function with multiple parameters is rewritten as a series of new functions, each with only one parameter.

Code Snippet
module Multiplier =
let multiply (logger: ILogger) (a:int) (b:int) =
let result = a * b
logger.LogInformation($"Result is {result}")
result
// Imagine 'logger' already being defined in Startup
// Partially apply 'logger' to Multiplier.multiply
let multiply = Multiplier.multiply logger
multiply 10 10