使用 Ninject 2.2 + 全局操作过滤器进行 MVC 3 依赖注入

2023-11-21

我正在尝试使用 ASP.NET MVC 3 和 Ninject 2.2 将记录器对象注入自定义 ActionFilterAttribute 中。

如果我用自定义属性标记每个控制器,我就可以让它工作。

但是,如果我从控制器中删除属性装饰并尝试使用全局操作过滤器,我将无法使其工作。

这是代码:

在 App_Start 下 - NinjectMVC3.cs

using NinjectTest.Abstract;
using NinjectTest.Concrete;

[assembly:      WebActivator.PreApplicationStartMethod(typeof(NinjectTest.App_Start.NinjectMVC3), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(NinjectTest.App_Start.NinjectMVC3), "Stop")]

namespace NinjectTest.App_Start
{
using Microsoft.Web.Infrastructure.DynamicModuleHelper;

using Ninject;
using Ninject.Web.Mvc;

public static class NinjectMVC3 
{
    private static readonly Bootstrapper bootstrapper = new Bootstrapper();

    /// <summary>
    /// Starts the application
    /// </summary>
    public static void Start() 
    {
        DynamicModuleUtility.RegisterModule(typeof(OnePerRequestModule));
        bootstrapper.Initialize(CreateKernel);
    }

    /// <summary>
    /// Stops the application.
    /// </summary>
    public static void Stop()
    {
        bootstrapper.ShutDown();
    }

    /// <summary>
    /// Creates the kernel that will manage your application.
    /// </summary>
    /// <returns>The created kernel.</returns>
    private static IKernel CreateKernel()
    {
        var kernel = new StandardKernel();
        RegisterServices(kernel);
        return kernel;
    }

    /// <summary>
    /// Load your modules or register your services here!
    /// </summary>
    /// <param name="kernel">The kernel.</param>
    private static void RegisterServices(IKernel kernel)
    {
        kernel.Bind<ILogger>().To<Log4NetLogger>();
    }       
}

}

全局.asax.cs

using System.Web.Routing;
using NinjectTest.Attributes;

namespace NinjectTest
{
public class MvcApplication : HttpApplication
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new TestLoggingAttribute());
        filters.Add(new HandleErrorAttribute());
    }

    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.MapRoute(
            "Default", // Route name
            "{controller}/{action}/{id}", // URL with parameters
            new { controller = "Home", action = "Index", id = UrlParameter.Optional } // Parameter defaults
        );

    }

    protected void Application_Start()
    {
        log4net.Config.XmlConfigurator.Configure();

        AreaRegistration.RegisterAllAreas();

        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);
    }
}

}

测试日志属性.cs

using System.Web.Mvc;
using Ninject;
using NinjectTest.Abstract;

namespace NinjectTest.Attributes
{
public class TestLoggingAttribute : ActionFilterAttribute
{
    [Inject]
    public ILogger _logger { get; set; }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {

        var controller = filterContext.RouteData.Values["controller"];
        var action = filterContext.RouteData.Values["action"];

        _logger.Info("controller: " + controller + " action: " + action);

        base.OnActionExecuted(filterContext);
    }     

  }
}

HomeController.cs

using System.Web.Mvc;
using NinjectTest.Attributes;

namespace NinjectTest.Controllers
{
//[TestLogging]
public class HomeController : Controller
{
    public ActionResult Index()
    {
        ViewBag.Message = "Welcome to ASP.NET MVC!";

        return View();
    }

    public ActionResult About()
    {
        return View();
    }

}
}

就像我提到的,如果我取消注释控制器中的 [TestLogging] 属性,这一切都会起作用。不过我想改用全局过滤器。 有人可以帮我吗?


您可能会发现以下博客文章有用。所以在你的RegisterServices方法简单:

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<ILogger>().To<Log4NetLogger>();
    kernel.BindFilter<TestLoggingAttribute>(FilterScope.Global, 0);
}       

并带来BindFilter将方法扩展到范围中不要忘记添加适当的using指示:

using Ninject.Web.Mvc.FilterBindingSyntax;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Ninject 2.2 + 全局操作过滤器进行 MVC 3 依赖注入 的相关文章

随机推荐

  • 如何在 Qt 中通过以太网播放流媒体音频?

    我的目标是通过 LAN 网络无延迟或最少延迟地传输 wav 文件 我们还按部分读取服务器计算机上的文件 均为 320 字节 之后我们通过 UDP 发送数据包并将接收写入 jitter buffer 中 抖动缓冲区的大小为 10 为了获得清晰
  • 部署带有嵌入式sqlite的winform应用程序

    我正在部署一个使用 vs 2008 0n XP sp3 构建的 winform 应用程序 我创建了一个带有空架构的数据库 将其放入项目的根文件夹和我选择的属性中Build Action 嵌入式资源 and Copy to Output di
  • iPhone:安装 SSL 连接证书

    我希望我的应用程序在设备上安装 SSL 证书 使其能够访问我的 https 网站 任何建议将不胜感激 谢谢 我发现最好的方法是执行以下操作 1 使用桌面浏览器将证书保存到本地 2 给自己写一封电子邮件 并将证书作为附件 3 在您的 iOS
  • 用于新闻源的 Firebase 扇出结构

    我有一个数据库posts users以及其他节点 例如经典的社交媒体应用程序 我正在继续对我的应用程序实施最佳实践 现在我想重写我的新闻报道 我关注的用户帖子 如 Instagram 中的主页选项卡 我读过一些关于fan out策略 现在我
  • 如何使用 CarrierWave 从 S3 获取真实文件

    我有一个读取文件内容并为其建立索引的应用程序 我将它们存储在磁盘本身中 但现在我使用 Amazon S3 因此以下方法不再有效 事情是这样的 def perform docId document Document find docId if
  • 声明与 TypeScript 一起使用的 JS 库

    有很多类似问题的线程 但据我所知 这个线程是独一无二的 我在用着jQuery 地址插件在我的应用程序中 并想在 TypeScript 文件中使用它 不幸的是 这儿没有绝对打字可用于库的脚本 当我尝试使用 jQuery address 时 我
  • 无法使用 Hibernate/PostgreSQL 将欧洲符号存储到 LOB 字符串属性中

    我在使用 Hibernate 3 6 10 的 PostgreSQL 8 4 中将特殊字符 如欧元符号 写入和读回 LOB 字符串属性时遇到问题 我所知道的是 PostgreSQL 提供了两种不同的方法来在表的列中存储大字符对象 它们可以直
  • 获取最新的ajax请求并中止其他请求

    我一直在寻找 这个问题看起来很简单 但找不到答案 我有多个请求调用不同的网址 但对于每个 url 我只想要一次结果 并且它必须是被调用的同一 url 中的最后一个结果 我现在的问题是 如何只得到最后一个 我看了一下这个 好像是3年前的了 h
  • Vista 从设置中安排任务

    我正在使用 Visual Studio 2008 中的安装向导项目部署 C 应用程序 让 Windows 安排我的应用程序定期运行 例如每 8 小时 的最简单方法是什么 我更喜欢在应用程序安装期间进行此调度 以简化最终用户的设置 Thank
  • TFS2015 中的构建 $(System.DefaultWorkingDirectory) 在哪里设置?

    我正在尝试修改此变量的值 因为它当前指向在代理上运行的任何构建的源文件夹 而不是构建的根目录 有谁知道我可以在哪里修改这个变量 我查看了代理的配置 json 文件 但没有找到任何相关内容 您可以定义 System DefaultWorkin
  • 使用 astropy.io 读取大量 FITS 时出现 OSError 24(打开文件过多)

    我正在尝试使用以下命令将一些 2000 FITS 加载到内存中astropy io fits def readfits filename with fits open filename as ft the fits contain a si
  • 不好 PhantomJS 意外退出

    testem ci not ok 1 PhantomJS Browser phantomjs home ubuntu nvm v0 10 12 lib node modules testem assets phantom js http l
  • Oracle 错误“数据类型不一致:预期 CHAR 为 LONG”

    我正在尝试运行以下查询来查找包含给定关键字的视图 select from ALL VIEWS where OWNER SALESDBA and TEXT like rownum 我收到以下错误消息 ORA 00932 inconsisten
  • 带有取消令牌的 NetworkStream.ReadAsync 永远不会取消

    证据在这里 知道这段代码有什么问题吗 TestMethod public void TestTest var tcp new TcpClient ReceiveTimeout 5000 SendTimeout 20000 tcp Conne
  • Python/Flask - ValueError:对已关闭文件进行 I/O 操作

    在有人说这是重复之前 我不认为这是因为我看过类似的问题 但他们没有帮助我 我正在用 python 创建 Flask 服务器 我需要能够有一个显示 pdf 的 url 我尝试使用以下代码 app route pdf def pdfStuff
  • 如何以函数方式将字符串向量转换为整数向量?

    我正在尝试转换Vec lt str gt to Vec
  • 如何使用java流找到集合中BigDecimal字段的最小值?

    我想用java流迭代一个list并找到BigDecimal最低价格 下面说明了 但不起作用 因为min 不能接受BigDecimal class Product public BigDecimal price List
  • 另存为 XPS 文档的 FlowDocument 中缺少图像

    当 FlowDocument 保存为 XPS 文档时 获取 FlowDocument 中包含的图像以显示时遇到一些困难 这是我所做的 使用创建图像ImageWPF 的控制 我通过对 BeginInit EndInit 的调用将图像源设置为括
  • 使用 PHP 表单处理的单选按钮

    我有一个使用一些基本 PHP 提交的基本表单 我的表单提交工作很好 除了我有一个单选按钮 首选联系方法 我不知道如何在 PHP 中添加它以便在电子邮件中发送 两个单选按钮选项具有相同的名称 因此不能用作值 我的代码如下 PHP如下
  • 使用 Ninject 2.2 + 全局操作过滤器进行 MVC 3 依赖注入

    我正在尝试使用 ASP NET MVC 3 和 Ninject 2 2 将记录器对象注入自定义 ActionFilterAttribute 中 如果我用自定义属性标记每个控制器 我就可以让它工作 但是 如果我从控制器中删除属性装饰并尝试使用