我有一些扩展方法,它们是我的应用程序的核心。我使用它们通过一个中心异常处理程序将所有调用路由到我的OData服务。看起来是这样的:
var results = Entites.Customers.Where(x=>x.IsActive).Invoke();Invoke()是我的扩展方法,一切都很好!
但是,当我得到一个例外,我想记录它。
我发现的问题是,我的ILogger不能在static类中得到解决(类必须是静态的,才能有扩展方法)。
static 类内部是否有解决统一管理接口的方法?还是依赖注入模式无法处理这个C#特性?
发布于 2013-03-28 16:49:06
一种选择是在静态类中不包含任何实现。创建一个包含方法实现(而不是作为扩展方法)的非静态类,然后让扩展方法除了调用非扩展实现之外什么也不做。
这样做之后,实现就不再在静态类中了。
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-28 17:05:17
坏消息--没有办法做到这一点,一个好消息--您不需要在扩展方法中记录异常。只是让一个异常被抛出静态类之外,并以适当的方式处理它。
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
}https://stackoverflow.com/questions/15687547
复制相似问题