【发布时间】:2020-06-26 15:15:49
【问题描述】:
我有责任在中间件层中引入异常日志记录。这个中间件从上到下的调用如下:
//In layer C
public async Task<List<Foo>> GetFoo(GetFooRequest request)
{
return await _repository.GetFooAsync(request);
}
//In layer D
public async Task<List<Foo>> GetFooAsync(GetFooRequest request)
{
return await _context.Foo.Where(x=> x.FooId=request.FooID).ToListAsync();
}
我想登录 C 层,但是,Task 返回一个 System.Void,因此编译器会抱怨下面的代码。我明白为什么下面的代码会失败,但我在寻找解决方案模式或登录 C 层的做法时遇到问题。
//In layer C
public async Task<List<Foo>> GetFoo(GetFooRequest request)
{
try
{
return await _repository.GetFooAsync(request);
}
catch(Exception e)
{
base.LogException(e) //<- Not all code paths return a value
}
}
有没有一种方法可以创建一个调用方法并在那里进行日志记录的类,例如 return await LogInvoker.Invoke(_repository.GetFooAsync...)?或者这是否需要重构层之间的电流流动?
【问题讨论】:
-
既然你捕捉到了异常,那么在你调用 "LogException` 之后你想返回什么值?它要么必须是某种
List<>,要么你重新抛出异常。 -
可能是一个空列表。这似乎比再次抛出异常要好。
-
这样更好吗?现在调用方法不知道出了什么问题,所以它会愉快地继续。也许它会起作用,也许它不会;也许它会返回一个预期的结果,也许它不会。
-
一般模式是,如果你要求的东西应该在那里,但它不在那里,空或 null,那么这意味着获取它时出现问题并且错误已经记录。顶层是轻量级的并且没有日志记录,如果需要,他们可以将任何内容返回给客户端 403 或其他内容。尽管某些情况(例如搜索功能)可能只会返回“未找到”。但至少内部会知道错误。
-
我知道这是一个完全愚蠢的问题,因为我已经摆脱了杂草并回头看它。我一次处理了 100 件与 DI 和线程相关的事情,并认为红色波浪线是与我的模式相关的编译器错误。我没有意识到最简单的问题是我没有返回结果。我认为异步模式导致了一个问题。我会删除这篇文章,但不想惩罚回答的人。谁知道有人会从中找到用处,如果不是嘲笑我暂时失去所有明智的东西。
标签: c# async-await task