需要统一解析的扩展方法

本文关键字:扩展 方法 | 更新日期: 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
}