需要Unity解析的扩展方法

时间:2013-03-28 16:45:47

标签: c# .net dependency-injection unity-container

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

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

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

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

我发现的问题是我的ILogger无法在static类中解析(类必须是静态的,因为它有扩展方法。)

有没有办法解决static类内部的统一管理界面?或者依赖注入模式是否无法应对此C#功能?

2 个答案:

答案 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
}