gpt4 book ai didi

asp.net-mvc-3 - 如何使用 Ninject 将服务注入(inject)到 MVC 3 FilterAttributes 中?

转载 作者:行者123 更新时间:2023-12-02 16:20:50 25 4
gpt4 key购买 nike

我正在为我的 MVC 项目编写自定义 ErrorHandler 属性。我想将 EventViewerLogger 的实现注入(inject)到该属性中。

我正在使用 Ninject 2.2,它对于其他功能运行良好,例如注入(inject)存储库和通过 Controller 构造函数聚合服务。

我知道我无法通过构造函数将某个类的实现注入(inject)到属性中,因此我必须将其注入(inject)到属性的属性中。

界面如下:

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 注入(inject)到 CustomHandleErrorAttribute 类型的属性 Logger 中 1) 请求CustomHandleErrorAttribute

建议: 1) 确保实现类型具有公共(public)构造函数。 2) 如果您已经实现了 Singleton 模式,请改用 InSingletonScope() 的绑定(bind)。

Source Error: 


Line 27: foreach (var filter in filters)
Line 28: {
Line 29: kernel.Inject(filter.Instance);
Line 30: }

花了一天时间,学到了很多关于依赖注入(inject)的知识,这很棒,但是我在这里做错了什么?

最佳答案

Ninject.Web.Mvc 内置了名为“BindFilter”的功能,它允许您将属性(采用一些或不采用构造函数参数)映射到过滤器(注入(inject)其构造函数参数)。此外,如果需要,您可以使用它从属性复制值并将它们作为构造函数参数注入(inject)到过滤器中。它还允许您将过滤器的范围更改为每个操作或每个 Controller 等,以便它们实际上得到重新实例化(正常操作过滤器不会根据请求重新实例化)。

这是一个example我如何使用它来执行 UoW 操作过滤器。

关于asp.net-mvc-3 - 如何使用 Ninject 将服务注入(inject)到 MVC 3 FilterAttributes 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7663597/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com