asp.net-mvc-3 – 如何使用Ninject将服务注入MVC?? 3 FilterAttr
发布时间:2020-12-16 09:49:42 所属栏目:asp.Net 来源:网络整理
导读:我正在为我的MVC项目编写自定义的ErrorHandler属性.我想将EventViewerLogger的实现注入该属性. 我正在使用Ninject 2.2,它适用于其他功能,例如注入存储库和通过控制器构造函数的聚合服务. 我知道我不能通过构造函数将某个类的实现注入属性,因此我必须将它注入
我正在为我的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; } } } 当我启动应用程序时,我得到以下异常: 激活路径: 建议: Source Error: Line 27: foreach (var filter in filters) Line 28: { Line 29: kernel.Inject(filter.Instance); Line 30: } 花了一天时间,学到了很多关于依赖注射的知识,这很好,但我在这里做错了什么? 解决方法
Ninject.Web.Mvc具有内置的名为“BindFilter”的功能,它允许您将属性(需要一些或不带构造函数的args)映射到过滤器(其中注入了构造函数args).此外,您可以使用它来复制属性中的值,并根据需要将它们作为构造函数args注入过滤器.它还允许您将过滤器的范围更改为每个操作或每个控制器等,以便实际重新实例化(正常操作过滤器不会按请求重新实例化).
这是我用它来做一个UoW动作过滤器的example. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
推荐文章
站长推荐
- asp.net-core – 有没有办法将ASP.NET Core应用程
- asp.net-mvc – 如何将现有的asp.net应用程序迁移
- asp.net-mvc-3 – 谷歌页内分析在我的ASP.NET MV
- asp.net – 从数据库加载对象列表以实例化单个对
- Asp.net Images随机提供401个未经授权的错误
- 什么是您最喜欢的ASP.NET添加工具/工具以提高生产
- asp.net-mvc – ASP.NET MVC2和MemberShipProvid
- asp.net-mvc – ASP.NET MVC主页数据
- asp.net-mvc-4 – Dapper多对多查询
- ASP.NET从.aspx链接返回图片
热点阅读