首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >需要统一解决的扩展方法

需要统一解决的扩展方法
EN

Stack Overflow用户
提问于 2013-03-28 16:45:47
回答 2查看 1.6K关注 0票数 0

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

代码语言:javascript
复制
var results = Entites.Customers.Where(x=>x.IsActive).Invoke();

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

但是,当我得到一个例外,我想记录它。

我发现的问题是,我的ILogger不能在static类中得到解决(类必须是静态的,才能有扩展方法)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-28 16:49:06

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

这样做之后,实现就不再在静态类中了。

代码语言:javascript
复制
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
    }
}
票数 2
EN

Stack Overflow用户

发布于 2013-03-28 17:05:17

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

代码语言:javascript
复制
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()方法中。

代码语言:javascript
复制
if(Entites.Customers.Where(x=>x.IsActive).TryInvoke(out results))
{
  // Success
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15687547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档