0

登记

container.AddFacility<LoggingFacility>(f => f.LogUsing(LoggerImplementation.NLog)
                                                         .WithConfig("NLog.config"));

此代码根据此文档页面

现在这是使用 NLog 的代码,即 Castle Windsor 将提供 NLog 作为 _logger 实现:

public class EmailController : Controller
{

    private ILogger _logger = NullLogger.Instance;

    ...

    public ILogger Logger
    {
        get { return _logger; }
        set { _logger = value; }
    }

    public ActionResult Send(UserMessageModel userMessage, bool captchaValid, string captchaErrorMessage)
    {


        if (ModelState.IsValid)
        {
            try
            {
                // Do something
            }
            catch (Exception ex)
            {
                _logger.Error(string.Format("Error msg:{0}\rError stacktrace:{1}", ex.Message, ex.StackTrace));
                ...
            }
        }
        ...
    }
}

但是,如果我这样更改代码:

[CustomHandleError]
public class EmailController : Controller
{
    [CustomHandleError]
    public ActionResult Send(UserMessageModel userMessage, bool captchaValid, string captchaErrorMessage)
    {


        if (ModelState.IsValid)
        {
            // Do something
        }
        ...
    }
    ...
}
public class CustomHandleError: HandleErrorAttribute
{
    private ILogger _logger = NullLogger.Instance;

    public ILogger Logger
    {
        get { return _logger; }
        set { _logger = value; }
    }

    public override void OnException(ExceptionContext filterContext)
    {
        if (filterContext == null)
        {
            base.OnException(null);
        }

        _logger.Error(string.Format("Error msg:{0}\rError stacktrace:{1}", filterContext.Exception.Message, filterContext.Exception.StackTrace));

        if (filterContext.HttpContext.IsCustomErrorEnabled)
        {
            filterContext.ExceptionHandled = true;
            base.OnException(filterContext);
        }
    }
}

在这种情况下,_logger 是“NullLogger.Instance”。我认为我拥有“Logger”属性这一事实意味着 Castle Windsor 会像之前的代码一样将 _logger 更改为 NLog。

我会误会什么?

编辑

我现在在这里添加了代码,如果有人可以看看它会很棒。

仅供参考:有 4 个提交。第一次提交是初始提交 第二次提交表明我可以让 NLog 按我的要求工作 第三次提交表明我可以让数据属性正常工作,即我在 Castle Windsor 中成功注册了过滤器 最后一次提交是问题我在上面描述过,即我无法让集中式日志记录使用 NLog。

4

1 回答 1

1

过滤器不会通过容器自动创建。您需要在控制器工厂中使用 IActionInvoker。

阅读这篇文章 Castle Windsor - 注入 IActionInvoker 实施问题

编辑

您的自定义过滤器需要从 ActionFilterAttribute 而不是 HandleErrorAttribute 派生,以便让容器注入依赖项(利用您的示例中实现的 IActionInvoker)。如果您的过滤器的目的是处理错误,那么也实现 IExceptionFilter。

于 2013-08-22T16:26:01.423 回答