我正在使用 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();
}
}
我对两个接口感兴趣。第一个是将对象绑定到全局变量(BackgroundWork 的 ILogger)。
第二个是 ActionFilter。我读http://www.planetgeek.ch/2010/11/13/official-ninject-mvc-extension-gets-support-for-mvc3/ 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>();
}
}
请注意,您必须使用this
因为BindFilter
是一个扩展方法,你还必须引用Ninject.Web.Mvc.FilterBindingSyntax
命名空间。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)