如何在 ASP.NET MVC 的 RegisterGlobalFilters 方法中进行依赖项注入

2024-01-02

我对使用 IOC 容器还是有点陌生​​,而且有点挣扎。我正在使用 ASP.NET MVC 5.2 和 Ninject.MVC3。我有一个异常过滤器,基本上将其交给日志服务:

public class ExceptionLoggerFilter : IExceptionFilter
{
    private readonly ILogService _logService;

    public ExceptionLoggerFilter(ILogService logService) {
        _logService = logService;
    }

    public void OnException(ExceptionContext filterContext) {
        _logService.LogError(filterContext.Exception);
    }
}

我想使用依赖注入来获取日志服务的实例。但是,RegisterGlobalFilters 方法是静态的:

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new ExceptionLoggerFilter(???));
    }
}

我可以使用 FilterConfig 的静态构造函数,但这感觉不是一个好的解决方案。

我尝试在 ExceptionLoggerFilter 类中使用属​​性注入,但它不起作用(LogService 始终为 null):

[Inject]
public ILogService LogService { get; set; }

我已经阅读了有关使用 Factory 模式的内容,但它似乎没有帮助,因为我仍然需要将 Factory 类注入 FilterConfig 类的静态构造函数中。我可能是错的,但这也不是正确的解决方案。

目前,我使用 just-give-me-an-instance 方法:

var logService = (ILogService)DependencyResolver.Current.GetService(typeof(ILogService));
filters.Add(new ExceptionLoggerFilter(logService));

这可行,但这是一个好的解决方案吗?有没有更好的办法?我对依赖注入和 IOC 容器的想法是否都混乱了?


MVC 全局过滤器只是实例列表。这意味着此类过滤器具有的任何依赖项也将成为单例。这意味着您应该非常小心这种方法,因为它很容易意外地导致圈养依赖 http://blog.ploeh.dk/2014/06/02/captive-dependency/在您的应用程序中。强制依赖项通常很难跟踪,并且通常只在测试或生产中弹出。

相反,您应该创建一个代理类,它可以在使用过滤器时委托回您的容器/内核,以便它可以当场解析真正的过滤器。这可以防止强制依赖关系。

这样的代理可以如下所示:

public class NinjectExceptionFilterProxy<TExceptionFilter> : IExceptionFilter
    where TExceptionFilter : IExceptionFilter
{
    private readonly Kernel _kernel;

    public ExceptionLoggerFilter(Kernel kernel) {
        _kernel = kernel;
    }

    public void OnException(ExceptionContext filterContext) {
        var filter = _kernel.Get<TExceptionFilter>();
        filter.OnException(filterContext);
    }
}

您可以按如下方式注册代理过滤器:

public static void RegisterGlobalFilters(GlobalFilterCollection filters, IKernel kernel)
{
    filters.Add(new NinjectExceptionFilterProxy<ExceptionLoggerFilter>(kernel));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ASP.NET MVC 的 RegisterGlobalFilters 方法中进行依赖项注入 的相关文章

随机推荐

  • 如何使用html2canvas上传屏幕截图?

    Using html2canvas http html2canvas hertzen com 如何将屏幕截图保存到对象 我一直在探索演示 发现生成屏幕截图的函数生成如下 window ready function body html2can
  • C++ 函数不可用

    我有以下文件 cumsum bounded cpp include
  • 从 IP 范围到 CIDR 掩码的转换

    我一直在研究一种算法 用于将 IP 范围转换为 CIDR 表示法中的 IP 列表 此后将作为元组提及 现在 让我困惑的是弄清楚这种转换的最坏情况是什么 对于 IPv4 范围 我可以获得的最大元组数是多少 对于 IPv6 范围 我可以获得的最
  • pod 定义中的 env 变量名称重复,确定最终值的优先规则是什么?

    使用 Kubernetes 1 19 3 我使用 3 种不同的方式初始化环境变量值 envpod 定义中具有显式键 值的字段 envFrom using configMapRef and secretRef 当键名重复时 如下例所示 DUP
  • 如何在 kaminari 中设置首页的初始偏移量?

    我需要实现一些逻辑 以便在第一页上显示 3 个元素 在所有下一页上显示 1 个元素 对于第一页来说没有问题 items model limit first page items 对于接下来的所有我尝试过的 model offset firs
  • 如何在 PHP/MySQL 中存储生日和年龄以便年龄可以每天更新?

    我应该如何在 MySQL 中存储生日 以便我可以通过 Cron 作业每天轻松更新每个人的年龄 存储年龄和出生日期是否有意义 以便在进行涉及年龄的搜索时 我不必即时计算每个年龄并浪费 CPU 资源 如果是这样 我应该如何 1 存储出生日期 2
  • 如何在 HTML 中显示字符串而不换行?

    我正在为一个网站编写服务器端代码 并且我可以使用多个字符串来表示每个实体 例如 full name San Francisco Giants long name Giants medium name Giants short name SF
  • ruby 对于所有 x 是否有恒等函数,即 x.fn == x?

    有时 当我将方法名称作为参数传递时 我发现自己希望有一个恒等函数 这样any obj send identity any obj 所以代替这个 transform nil my obj my obj send transform 我可以写
  • mongoDB:通过嵌入值查找

    我在 mongoDB 方面遇到了一些问题 我寻找答案 但找不到任何东西 这解决了我的问题 db coders save name John languages php bad java good brainfuck very bad db
  • Xpages:让 FullCalendar 与引导主题一起使用

    Per 的回答是解决方案的重要组成部分 为了完整起见 这是我最终要做的 首先 我必须解决 Per 提到的 AMD 问题 然后我必须修改我的 Xpage 以确保以正确的顺序加载正确的库 其中一些是通过反复试验完成的 我必须将资源聚合设置设置为
  • python 列表元素明智条件增量

    我已经搜索了一段时间了 基本上我正在尝试按元素有条件地按另一个列表增加一个元素列表 我的代码如下 但是有更好的方法吗 列表理解 地图 我认为像 这样的逐元素运算符来自http www python org dev peps pep 0225
  • string_view 的 C++17 运算符""?

    C 17 是否包含文字后缀const char to std string view转换 auto str asdf s 请问类型str在上面的声明中是std string or std string view 如果我们相信STL的评论 h
  • 如何设置Nuxt 3中useFetch中使用的全局API baseUrl

    如何全局设置 useFetch 可组合项中使用的 baseUrl 可能是 nuxt config ts 如何避免在每次 useFetch 中定义它 您可以定义baseURL在你的nuxt config js ts像这样 import def
  • Windows 静态库检查器?

    我知道有像 PE Explorer 这样的工具可以检查 Windows 上 DLL 的内容 导出的符号等 静态库有类似的东西吗 我正在链接生成一些链接错误的第三方库 并且我想仔细检查是否确实提供了我期望的符号 Dumpbin http su
  • 使用 JavaScript 创建表

    我有一个 JavaScript 函数 它创建一个包含 3 行 2 个单元格的表格 谁能告诉我如何使用我的函数创建下表 我需要根据我的情况执行此操作 下面是我的 JavaScript 和 HTML 代码 function tableCreat
  • VS + Cordova + WP8 = requirejs 模块加载超时

    我正在使用 Visual Studio 2015 Cordova 构建 Windows Phone 手机游戏 当尝试在设备上调试时 我收到此错误 中第 8 行第 137 列未处理的异常 ms appx web net boardgameso
  • 如何在 Vue 3 Composition API 中设置 Pinia getter

    我正在使用 Vue 3 Composition API 和 Pinia 构建 Pokemon 过滤搜索应用程序 我正在尝试设置应用程序 以便将从 Pokemon API 获取的响应传递到 fetchPokemon 函数内的商店 使用 Pin
  • ListView 标题不显示

    我正在做一个Windows Mobile应用程序6 1 我拖入列表视图并转到列并将列添加到列表视图中 当我运行列表视图时 它们不会显示 然后 我尝试使用以下代码在页面加载时通过 C 代码添加它们 ColumnHeader header ne
  • 对象的类型为“未知” - forEach 和 map

    我正在使用一个对象进行循环forEach or map 但是 我在用于循环的变量上遇到类型错误 错误是Object is of type unknown 这发生在val name val title 使用 forEach Object en
  • 如何在 ASP.NET MVC 的 RegisterGlobalFilters 方法中进行依赖项注入

    我对使用 IOC 容器还是有点陌生 而且有点挣扎 我正在使用 ASP NET MVC 5 2 和 Ninject MVC3 我有一个异常过滤器 基本上将其交给日志服务 public class ExceptionLoggerFilter I