使用Ninject2 InRequestScope时可以回复Dispose进行清理吗?

时间:2011-12-08 11:21:03

标签: c# asp.net-mvc-3 ninject idisposable

在我正在开发的应用程序中,我创建了一个轻量级记录器,它有两个目的。使用枚举“域”记录的错误将记录到数据库中,而使用枚举“应用程序”记录的错误可以从服务中提取以显示给用户。

我正在使用ninject InRequestScope来允许在请求范围内维护错误集合。

我不确定的一个问题是何时应该调用该函数将错误记录到数据库中。此函数使用Transaction将所有错误推送到DB中。我的想法是让错误记录器使用IDisposable,然后从Dispose方法调用LogErrorsToDatabase()方法。

这样做有什么问题吗?

ninject是否会自动调用dispose,或者我是否需要对其进行配置?

我首先尝试将服务注入Global.asax,但这有不可预知的问题。

编辑:我找到了一种更优雅的方法,所以为了将来的参考,我将在下面详细说明。

我首先创建了一个自定义操作过滤器,并使用属性注入来注入IErrorLog服务:

public class LogErrorsAttribute : ActionFilterAttribute
{
    [Inject]
    public IErrorQueue ErrorQueue { private get; set; }

    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        ErrorQueue.CommitDatabaseLog();
        base.OnResultExecuted(filterContext);
    }
}

我接下来使用Ninject的BindFilter方法将此函数绑定到每个被调用的操作:

 BindFilter<LogErrorsAttribute>(FilterScope.Last, 0);

现在一切都很完美和干净。

最终编辑:我注意到有人最近投了这个,所以他们可能已经使用了我找到的解决方案。我确实发现了上一次编辑中的解决方案的错误。似乎我的导航控制器正在触发此功能,在导航触发时,没有发生错误,这写入filtercontext并在稍后通过链操作调用时停止它的功能。为了解决这个问题,我使用了以下绑定代码:

kernel.BindFilter<LogErrorsAttribute>(FilterScope.Last, 0).When(
            (context, ad) => !string.IsNullOrEmpty(ad.ActionName) && ad.ControllerDescriptor.ControllerName.ToLower() != "navigation");

这会停止任何导航代码触发过滤器(从控制器渲染部分视图。)

1 个答案:

答案 0 :(得分:4)

是Ninject会在请求范围内处理对象。