【发布时间】:2011-12-01 14:12:33
【问题描述】:
我正在为我的 MVC 项目编写自定义 ErrorHandler 属性。我想将 EventViewerLogger 的实现注入该属性。
我使用的是 Ninject 2.2,它适用于其他功能,例如注入存储库和通过控制器构造函数聚合服务。
我知道我不能通过构造函数将某个类的实现注入到属性中,因此我必须将它注入到属性的属性中。
界面如下:
namespace Foo.WebUI.Infrastructure
{
public interface ILogger
{
void Log(Exception e);
}
}
事件查看器记录器实现
namespace Foo.WebUI.Infrastructure
{
/// <summary>
/// Logs exceptions into the Windows Event Viewer
/// </summary>
public class EventViewerLogger: ILogger
{
private EventViewerLogger _logger = null;
EventViewerLogger()
{
_logger = new EventViewerLogger();
}
public void Log(Exception e)
{
_logger.Log(e);
}
}
}
以下是错误处理程序的代码:
namespace Foo.WebUI.Handlers
{
/// <summary>
/// Custom error handler with an interface to log exceptions
/// </summary>
public class CustomHandleErrorAttribute: HandleErrorAttribute
{
[Inject]
public ILogger Logger { get; set; }
// Default constructor
public CustomHandleErrorAttribute():base() { }
public override void OnException(ExceptionContext filterContext)
{
Logger.Log(filterContext.Exception);
base.OnException(filterContext);
}
}
}
在 global.asax 中,我注册了处理程序和 Ninject。
protected void Application_Start()
{
IKernel kernel = new StandardKernel(new NinjectInfrastructureModule());
}
最后,我有一个自定义过滤器提供程序
namespace Foo.WebUI.Infrastructure
{
public class NinjectFilterProvider: FilterAttributeFilterProvider
{
private readonly IKernel kernel;
public NinjectFilterProvider(IKernel kernel)
{
this.kernel = kernel;
}
public override IEnumerable<Filter> GetFilters(ControllerContext controllerContext, ActionDescriptor actionDescriptor)
{
var filters = base.GetFilters(controllerContext, actionDescriptor);
// Iterate through all the filters and use Ninject kernel to serve concrete implementations
foreach (var filter in filters)
{
kernel.Inject(filter.Instance);
}
return filters;
}
}
}
当我启动应用程序时,出现以下异常:
激活路径: 2) 将依赖 ILogger 注入 CustomHandleErrorAttribute 类型的属性 Logger 1) 请求 CustomHandleErrorAttribute
建议: 1) 确保实现类型具有公共构造函数。 2) 如果你已经实现了 Singleton 模式,请改用 InSingletonScope() 的绑定。
Source Error:
Line 27: foreach (var filter in filters)
Line 28: {
Line 29: kernel.Inject(filter.Instance);
Line 30: }
花了一天的时间,学到了很多关于依赖注入的知识,这很棒,但是我在这里做错了什么?
【问题讨论】:
标签: asp.net-mvc-3 dependency-injection ninject