使用Visual Studio 2017构建C#Azure Function v2项目。 我只定义了一个函数,但是在HTTP触发的执行期间,实例化了几个类。大部分由我自己的代码完成,有些由JSON反序列化完成(因此无法控制如何调用构造函数)。
函数方法签名会收到一个ILogger实例,该实例用于记录日志。 让我所有的类实例使用同一个ILogger实例,而不必将ILogger传递给每个类实例的最佳方法是什么?
我知道使用静态var是不可能的,因为它们在不同的函数调用之间共享,而每个调用都接收另一个ILogger实例。
此外,在这里似乎没有依赖注入,因为除了JSON可反序列化的类之外,这些类仅在内部使用。
以下是我的摘要代码。 我可以将ILogger传递给MyClass构造函数,但是myClass.PerformTheTask()执行复杂的代码,该代码使用并实例化多个类,所有这些类都需要记录内容。
这里最好的前进方式是什么?
[FunctionName("FunctionName")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "someroute{route}")] HttpRequest req,
ILogger log,
ExecutionContext context)
{
var myClass = new myClass(); //how to make myClass and its children access ILogger?
myClass.PerformTheTask();
}
答案 0 :(得分:0)
@EricG,
正如Fredrik正确地说的那样,您可以在现已支持的Azure函数V2中使用依赖注入.Azure函数建立在ASP.NET Core依赖注入功能之上。
您可以在此处和git repo中找到Azure示例以供参考。
它非常易于使用并且更清洁。它使用构造函数注入来注入依赖项。
public class SampleFunction
{
private readonly MyServiceA _serviceA;
private readonly MyServiceB _serviceB;
private readonly IGlobalIdProvider _globalIdProvider;
public SampleFunction(MyServiceA serviceA, MyServiceB serviceB, IGlobalIdProvider globalIdProvider)
{
_serviceA = serviceA ?? throw new ArgumentNullException(nameof(serviceA));
_serviceB = serviceB ?? throw new ArgumentNullException(nameof(serviceB));
_globalIdProvider = globalIdProvider ?? throw new ArgumentNullException(nameof(globalIdProvider));
}
[FunctionName("SampleFunction")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation($"Service A ID: {_serviceA.IdProvider.Id}. Service B ID: {_serviceB.IdProvider.Id}");
return new OkObjectResult(new
{
ProvidersMatch = ReferenceEquals(_serviceA.IdProvider, _serviceB.IdProvider),
GlobalId = _globalIdProvider.Id,
ServiceAId = _serviceA.IdProvider.Id,
ServiceBId = _serviceB.IdProvider.Id
});
}
}
类似地,您可以使用ILogger进行操作,并在类中使用它。希望对您有所帮助。