0

我有一些对我的应用程序来说相当核心的扩展方法。我使用它们通过中央异常处理程序将所有调用路由到我的 OData 服务。它看起来像这样:

var results = Entites.Customers.Where(x=>x.IsActive).Invoke();

Invoke()是我的扩展方法,一切都很好!

但是当我遇到异常时,我想记录它。

我发现的问题是我ILogger无法在static类内部解决(该类必须是静态的才能具有扩展方法。)

有没有办法解决一个static类内部的统一管理接口? 还是依赖注入模式无法处理这个 C# 特性?

4

2 回答 2

2

一种选择是在静态类中没有任何实现。创建一个包含方法实现的非静态类(不是作为扩展方法),然后让扩展方法除了调用非扩展实现之外什么都不做。

之后,实现不再在静态类中。

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
    }
}
于 2013-03-28T16:49:06.187 回答
1

一个坏消息——没有办法做到这一点,一个好消息——你不需要在你的扩展方法中记录异常。只需让异常在静态类之外抛出并以适当的方式处理即可。

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.");
}

编辑:

它们中的大多数与通信相关,将在扩展方法中处理。只有少数与业务相关的内容将被重新抛出。

如果异常是“通信相关”或第 3 方,也许您不需要记录它们。在这种情况下,我将创建一个TryInvoke()不带日志记录的方法,该方法返回TRUE成功操作并有一个OUT参数。如果你想记录它们,你应该ILogger在你的Invoke()方法中注入。

if(Entites.Customers.Where(x=>x.IsActive).TryInvoke(out results))
{
  // Success
}
于 2013-03-28T17:05:17.573 回答