加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

asp.net-mvc-3 – 在Application_Start中访问ninject内核

发布时间:2020-12-16 00:26:49 所属栏目:asp.Net 来源:网络整理
导读:我正在使用Ninject和安装了nuget的MVC3扩展。我的内核设置代码位于App_Start / NinjectMVC3.cs文件中。控制器中的一切都很好,但是我无法弄清楚如何(正确地)绑定Global.asax.cs MvcApplication代码中的接口。 我最终使用hack(创建一个返回bootstrap.kernel的
我正在使用Ninject和安装了nuget的MVC3扩展。我的内核设置代码位于App_Start / NinjectMVC3.cs文件中。控制器中的一切都很好,但是我无法弄清楚如何(正确地)绑定Global.asax.cs MvcApplication代码中的接口。

我最终使用hack(创建一个返回bootstrap.kernel的公共NinjectMVC3.GetKernel()方法)。但是,这样做将不再适用,我必须有一个正确的方法来做到这一点。

这是我的代码:

public class LogFilterAttribute : ActionFilterAttribute
{
    private IReportingService ReportingService { get; set; }
    public LogFilterAttribute( IReportingService reportingService )
    {
        this.ReportingService  = reportingService;
    }
    ...
}

public class MvcApplication : System.Web.HttpApplication
{
    public static void RegisterGlobalFilters( GlobalFilterCollection filters )
    {
        filters.Add( new HandleErrorAttribute() );
        filters.Add( new LogFilterAttribute()  );
    }
    ...
    protected void Application_Start()
    {
        ...
        RegisterGlobalFilters( GlobalFilters.Filters );
        // NOTE hack:
        var kernel = NinjectMVC3.GetKernel();
        var logger = kernel.Get<ILogger>();
        var bw = new BackgroundWork(logger);
        Application["BackgroundWork"] = bw;
        bw.Start();
    }
}

有两个我感兴趣的接口:第一个是将一个对象绑定到一个Global变量(Backgroundog的ILogger)。

第二个是ActionFilter。我读了http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/,但我看不到它如何插入实际的注册(filter.Add)。

我不想使用属性注入,如果我可以避免它。

对这样做的正确方法有什么想法?
谢谢

解决方法

MVC 3引入了DependencyResolver,它被填充到单例中,Ninject扩展支持它。如果需要,您可以在MvcApplication类中使用它:
protected void Application_Start()
{
    // ...
    var logger = DependencyResolver.Current.GetService<ILogger>();
}

现在我应该指出,没有必要用动作过滤器来做到这一点。在Ninject.MVC3中,您应该使用BindFilter语法,如下所示:

// Declare empty attribute
public class MyFilterAttribute : FilterAttribute { }

// Dependency module
public class MyModule : NinjectModule
{
    public override void Load()
    {
        // Other bindings
        // ...
        this.BindFilter<MyActionFilter>(FilterScope.Action,1)
            .WhenControllerHas<MyFilterAttribute>();
    }
}

请注意,您必须使用此功能,因为BindFilter是一种扩展方法,并且还必须引用Ninject.Web.Mvc.FilterBindingSyntax命名空间。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读