我有一些扩展方法对我的应用来说是相当核心的。我使用它们通过中央异常处理程序将所有调用路由到我的OData服务。它看起来像这样:
var results = Entites.Customers.Where(x=>x.IsActive).Invoke();
Invoke()
是我的扩展方法,一切都很棒!
但是当我得到异常时,我想记录它。
我发现的问题是我的ILogger
无法在static
类中解析(类必须是静态的,因为它有扩展方法。)
有没有办法解决static
类内部的统一管理界面?或者依赖注入模式是否无法应对此C#功能?
答案 0 :(得分: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
}
}
答案 1 :(得分: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.");
}
修改强>
他们中的大多数都是与通讯相关的,并且会在其中处理 扩展方法。只有少数与业务相关的将是 重新抛出。
如果例外是“通信相关”或第三方,则可能您不需要记录它们。在这种情况下,我将创建一个没有日志记录的TryInvoke()
方法,它为成功操作返回TRUE
并且具有OUT
参数。如果要记录它们,则应在ILogger
方法中注入Invoke()
。
if(Entites.Customers.Where(x=>x.IsActive).TryInvoke(out results))
{
// Success
}