在我正在开发的应用程序中,我创建了一个轻量级记录器,它有两个目的。使用枚举“域”记录的错误将记录到数据库中,而使用枚举“应用程序”记录的错误可以从服务中提取以显示给用户。
我正在使用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");
这会停止任何导航代码触发过滤器(从控制器渲染部分视图。)
答案 0 :(得分:4)
是Ninject会在请求范围内处理对象。