如何在 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 方法中进行依赖项注入 的相关文章

  • 无效操作。连接已关闭。 ASP.NET MVC

    这种情况并不经常发生 但有时我会收到一封通过电子邮件发送给我的异常报告 指出这段代码 我想知道您是否发现以下代码有任何问题 我无法让它在本地失败 并且使用断点跟踪数据总是会一步步给出正确的结果 namespace DomainModel C
  • 为什么 DropDownListFor 无法识别编辑器模板中的选定值?

    我有以下名为 DropDown cshtml 的编辑器模板 这list部分工作正常 模板使用了一些我所做的巫毒来获得所需的SelectList from ViewData 控制器将视图模型中的所有选择列表放入ViewData 并且列表方面没
  • ASP.NET Core/MVC 6 ViewModel 中的依赖注入 (DI)

    我使用构造函数注入在控制器中成功使用了 ASP NET 5 MVC 6 DI 我现在有一个场景 我希望我的视图模型在实现 IValidatableObject 时在 Validate 方法中使用服务 ViewModel 中的构造函数注入不起
  • asp.net mvc 3,主题(不同视图)

    我想向我的网站添加将使用完全不同视图的主题 我想在我的项目中看到它们 如下所示 Views Theme1 Views Theme2 而不是默认的 Views 当然 我需要一种简单的方法来在它们之间进行切换 所以问题是 如何让 ViewEng
  • ASP MVC:何时调用 IController Dispose()?

    我正在对我的一个较大的 MVC 应用程序进行大规模重构 速度调整 它已经部署到生产环境几个月了 我开始在连接池中等待连接超时 我已将问题追溯到连接未正确处理的情况 鉴于此 我对我的基本控制器进行了以下更改 public class MyBa
  • 在ConfigureServices中注入依赖

    在我的 ASP Net Core 应用程序中 我需要在以下位置注入一些依赖项 在我的例子中是一个存储库 ConfigureServices method 问题是该方法不允许使用多个参数来注入依赖项 该怎么办呢 这是我的代码 public v
  • 实体类型 ApplicationUser 不是当前上下文模型的一部分。在项目开始时使用了两个不同的数据库

    我使用实体框架创建了一个 MVC 4 应用程序来读取数据并将数据写入我在 Azure 数据库上托管的数据库 Azure 数据库应该保存应用程序数据和应用程序的登录数据 但是 当我第一次创建应用程序时 我忘记删除到本地计算机的连接字符串 因此
  • ASP.NET Core MVC防伪

    尝试在核心 mvc 项目中打开防伪功能 但没有成功 做了什么 添加过滤器以自动检查每个 POST 请求的防伪令牌 services AddMvc o gt o Filters Add new AutoValidateAntiforgeryT
  • 如何在ListBox中加载大量数据? ASP.NET MVC 应用程序

    我正在使用 ASP NET MVC 应用程序 要求用户能够从可能包含超过 30 000 个条目的列表框中选择一个项目 是否有一种使用 Ajax 调用来填充此 ListBox 内容的动态方法 效果良好 我是否最好只填充服务器上的 ListBo
  • 显示 PDF ASP.Net MVC

    我的桌面上有一个文件用于测试 我试图在如下视图中显示它 ViewBag Title ShowFile h2 ShowFile h2 我用于控制器的代码是 HttpGet public ActionResult ShowFile string
  • 服务层设计。将事物放入服务层的原因

    我有一些与设计相关的问题 should service layer interfaces居住在一个domain layer 例如user service 将代码部分移动到单独层的主要原因是什么 should service layer居住在
  • 如何使自定义错误页面在 ASP.NET MVC 4 中工作

    我想要显示 500 404 和 403 的自定义错误页面 这是我所做的 在 web config 中启用自定义错误 如下所示
  • 为什么自定义类型变量不保存值MVC

    我正在尝试使用 MVC 5 构建一个网站 我有一个包含 3 个变量的控制器类 public class WorkerController Controller public ViewModel viewModel new ViewModel
  • asp.net mvc 它能处理所有请求吗? - iis 7集成模式

    我有一个使用 asp net mvc 构建的网站 在 IIS 7 上使用集成模式运行 我注意到 当我输入 mysite com test html 时 我得到了 The IControllerFactory did not return a
  • 有没有更好的方法使用 MVC 4 和 Entity Framework 5 添加子记录?

    我正在学习 MVC 并结合实体框架处理其无状态性质 我的问题是 有没有更优雅的方式来处理下面的场景 我有两个 POCO 实体 public class Contest public long ID get set public IColle
  • 如何使用 ILoggerFactory 记录 Polly 的重试

    或者 如何从静态方法记录 From https github com App vNext Polly https github com App vNext Polly你有这样的例子 其中记录器神奇地可用 Policy Timeout 30
  • asp.net mvc 4 - 可以在每个线程共享 DbContext 吗?

    From 每个 Web 请求一个 DbContext 为什么 https stackoverflow com questions 10585478 one dbcontext per web request why 我的理解是 DbCont
  • IsReusable 属性中的上下文切换

    是否可重用属性 下面是我的理解IsReusable财产 如果处理程序返回静态内容 将值设置为 true 是安全的 但如果线程返回动态内容 为了使其线程安全 IsReusable应设置为 false 在这种情况下 可能会发生上下文切换 这可能
  • 缺少添加控制器/视图的上下文菜单

    我已将 ASP NET MVC 4 集成到现有的 asp net 网站中 两者都工作正常 但我没有看到任何菜单 快捷方式来在 Visual Studio IDE 中创建控制器 视图 这些仅适用于 ASP NET MVC 模板吗 这些仅适用于
  • Asp.net MVC 路由 - 防止通过约束路由到 XML 文件

    我正在尝试找到一种方法来阻止用户访问特定的 xml 文件 我尝试过做 routes MapRoute SiteMap SiteMap siteMap xml new new isLocal new LocalHostRouteConstra

随机推荐

  • 如何使用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