需要统一解析的扩展方法
本文关键字:扩展 方法 | 更新日期: 2023-09-27 18:06:34
我有几个扩展方法是相当核心的我的应用程序。我使用它们路由所有调用到我的OData服务通过一个中央异常处理程序。它看起来像这样:
var results = Entites.Customers.Where(x=>x.IsActive).Invoke();
Invoke()
是我的扩展方法,它都工作得很好!
但是当我得到一个异常时,我想要记录它。
我发现的问题是,我的ILogger
不能解决在static
类(类必须是静态的,它有扩展方法。)
是否有办法解决一个统一管理的接口内部的static
类?还是依赖注入模式无法处理这个c#特性?
一种选择是在静态类中没有任何实现。创建一个包含方法实现的非静态类(不是作为扩展方法),然后让扩展方法除了调用非扩展实现之外什么都不做。
这样做之后,实现不再是静态类。
public static class MyExtension
{
public static void Invoke<T>(this IQueryable<T> query)
{
MyExtensionImplementation.Invoke(query);
}
}
internal class MyExtensionImplementation
{
public static void Invoke<T>(IQueryable<T> query)
{
//actual work
}
}
一个坏消息——没有办法做到这一点,一个好消息——你不需要在你的扩展方法中记录异常。只要让异常在静态类之外抛出,并以适当的方式处理即可。
IResult results;
try
{
results = Entites.Customers.Where(x=>x.IsActive).Invoke();
}
catch(YourOwnException ex)
{
Log(ex, "The Business logic error.");
}
catch(ArgumentException ex)
{
Log(ex, "Invalid arguments.")
}
...
catch(Exception ex)
{
Log(ex, "Unknown error.");
}
编辑:大多数是通信相关的,将在扩展方法。只有少数与业务相关的会被取消rethrown .
如果异常是"通信相关的"或第三方的,也许你不需要记录它们。在本例中,我将创建一个没有日志记录的TryInvoke()
方法,如果操作成功,它将返回TRUE
,并具有OUT
参数。如果你想记录它们,你应该在你的Invoke()
方法中注入ILogger
。
if(Entites.Customers.Where(x=>x.IsActive).TryInvoke(out results))
{
// Success
}