새로운 DI를 사용하여 ILogger를 IWebJobs Startup을 사용하여 Azure 함수에 주입하려면 어떻게 해야 합니까?
사용 중Azure Function
v2. 생성자 주입을 사용하는 함수는 다음과 같습니다.
public sealed class FindAccountFunction
{
private readonly IAccountWorkflow m_accountWorkflow;
private readonly IMapper m_mapper;
private readonly ILogger m_logger;
public FindAccountFunction(ILogger logger, IMapper mapper, IAccountWorkflow accountWorkflow)
{
m_logger = logger;
m_mapper = mapper;
m_accountWorkflow = accountWorkflow;
}
[FunctionName("FindAccount")]
public async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, Verbs.Get, Route = "v1/accounts/")] HttpRequest httpRequest, ILogger logger)
{
// Do stuff.
}
}
시작 클래스에서 Azure 함수에 주입하려는 모든 종속성을 선언합니다.IWebJobsStartup
:
public sealed class Startup : IWebJobsStartup
{
public void Configure(IWebJobsBuilder webJobsBuilder)
{
// Registers the application settings' class.
webJobsBuilder.Services.AddSingleton<IApplicationSettings, ApplicationSettings>();
// ** Registers the ILogger instance **
// ** ?? **
// Registers the IMapper instance for the contracts.
var mapperConfiguration = new MapperConfiguration(cfg => cfg.AddProfile(new MyProfile()));
webJobsBuilder.Services.AddSingleton(mapperConfiguration.CreateMapper());
// Registers custom services.
webJobsBuilder.Services.AddTransient<IStorageService, StorageService>();
webJobsBuilder.Services.AddTransient<IAccountWorkflow, AccountWorkflow>();
}
}
Azure 함수는 ILogger에 의존하는 다른 주입된 서비스도 호출합니다. 예를 들어,IAccountWorkflow
:
public sealed class AccountWorkflow : IAccountWorkflow
{
public AccountWorkflow(ILogger logger, IStorageService storageService)
{
if(logger is null)
throw new ArgumentNullException();
}
}
문제는 DI가 어떤 것도 찾을 수 없다는 것입니다.ILogger
구현 및 null 이후 서비스를 확인하지 못함ILogger
주입되었습니다.
질문.
의 주입을 설정하려면 어떻게 해야 합니까?ILogger
에IWebJobsStartup
?
갱신하다
참조 의 종속성 주입을 사용합니다.NET Azure 함수
서비스를 등록하는 중
서비스를 등록하려면 구성 방법을 생성하고 구성 요소를 에 추가할 수 있습니다.
IFunctionsHostBuilder
사례.Azure Functions 호스트가 다음을 생성합니다.IFunctionsHostBuilder
구성된 방법으로 직접 전달합니다.구성 방법을 등록하려면 다음을 사용하여 구성 방법의 유형을 지정하는 어셈블리 속성을 추가해야 합니다.
FunctionsStartup
기여하다.
그래서 이 경우에는
[assembly: FunctionsStartup(typeof(MyNamespace.Startup))]
namespace MyNamespace {
public class Startup : FunctionsStartup {
public override void Configure(IFunctionsHostBuilder builder) {
// ** Registers the ILogger instance **
builder.Services.AddLogging();
// Registers the application settings' class.
//...
//...omitted for brevity
}
}
}
원래의
서비스 컬렉션에 액세스할 수 있기 때문에 로깅을 추가할 수 있어야 합니다.
public void Configure(IWebJobsBuilder webJobsBuilder) {
// ** Registers the ILogger instance **
webJobsBuilder.Services.AddLogging();
//OR
//webJobsBuilder.Services.AddLogging(builder => {
// //...
//});
// Registers the application settings' class.
//...
//...removed for brevity
}
그리고 그것을 가지고 있습니다.ILoggerFactory
Function의 생성자에서.
//...
//Ctor
public FindAccountFunction(ILoggerFactory loggerFactory, IMapper mapper, IAccountWorkflow accountWorkflow) {
m_logger = loggerFactory.CreateLogger<FindAccountFunction>();
m_mapper = mapper;
m_accountWorkflow = accountWorkflow;
}
//...
저는 이 문제를 해결할 수 있었습니다.
다음과 같이 제 수업에 주입합니다.
MyClass.cs :
public class MyClass
{
private readonly ILogger<MyClass> _logger;
public MyClass(ILogger<MyClass> logger)
{
_logger = logger;
}
}
Startup.cs :
[assembly: FunctionsStartup(typeof(Namespace.Startup))]
namespace Namespace {
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
builder.Services.AddLogging();
}
}
}
의 호출을 제거해야 합니다.AddLogging
시작 클래스의 메서드입니다.기본 로거는 zure 함수 호스트에 의해 이미 설정되어 있습니다.
[assembly: WebJobsStartup(typeof(StartUp))]
public class StartUp : IWebJobsStartup
{
public void Configure(IWebJobsBuilder builder)
{
builder.Services.AddSingleton<AppSettings>();
builder.Services.AddTransient<IMyService, MyService>();
}
}
public MyFunction(IMyService service, ILogger<IMyService> logger)
{
this.service = service;
this.logger = logger;
}
인스턴스 메소드는 이제 Azure 함수 런타임 2.0.12265 이후로 Zure 함수와 함께 지원됩니다.
함수 Startup 클래스에 클래스를 등록하는 것 외에도, 우리는 네임스페이스를 다음에 추가해야 합니다.host.json
또한 파일을 사용하여 App Insight에 메시지를 기록할 수 있습니다.추가하지 않으면 로컬로 메시지를 콘솔에 기록하기만 하지만 zure에 배포하면 아무것도 기록하지 않고 오류도 발생하지 않습니다.
{
"version": "2.0",
"logging": {
"logLevel": {
"FunctionProjectNameSpace.RegisteredClass": "Information"
}
}
}
참고용 샘플 코드 - https://gist.github.com/nareshnagpal06/82c6b4df2a987087425c32adb58312c2
추가할 수 있습니다.
"logging": {
"fileLoggingMode": "debugOnly",
"logLevel": {
"default": "Information"
}
}
Ilogger Factory를 사용하려면 DI를 추가할 필요가 없습니다.
언급URL : https://stackoverflow.com/questions/54876798/how-can-i-use-the-new-di-to-inject-an-ilogger-into-an-azure-function-using-iwebj
'sourcecode' 카테고리의 다른 글
UI 보기의 왼쪽 상단 및 오른쪽 상단 모서리에만 모서리 반지름을 설정하는 방법은 무엇입니까? (0) | 2023.05.03 |
---|---|
zip 아카이브에서 파일 하나를 업데이트하는 방법 (0) | 2023.05.03 |
Xcode 10, UI 요소는 어디에 있습니까? (0) | 2023.05.03 |
WPF 데이터 템플릿이 목록 상자의 전체 너비를 채우도록 하려면 어떻게 해야 합니까? (0) | 2023.05.03 |
vba에서 문자열에 큰따옴표를 넣으려면 어떻게 해야 합니까? (0) | 2023.04.28 |