Joh*_*ebs 11 c# asp.net-mvc ninject
我试图找到一种方法来使用Ninject将构造函数依赖注入到过滤器中.我发现许多文章描述了属性注入,现在建议不要这样做,但其余文章涉及到工厂,定位器,全局包装器或存根属性的复杂设置.
使用MVC允许你覆盖它的几乎任何操作部分,我认为这只是一个创建自己的过滤器提供程序的情况,就像你创建自己的依赖项解析器一样.
什么是现在正确的注射方式,或者如果你使用某些类型的过滤器与其他过滤器变得更容易?
public class UserValidationAttribute : ActionFilterAttribute
{
private IRepository repository;
public UserValidationAttribute(IRepository repository)
{
this.repository = repository;
}
}
Run Code Online (Sandbox Code Playgroud)
sha*_*p00 18
有一种方法可以使用构造函数注入.
首先,将您的属性替换为仅用作标记的"空"属性
public class UserValidationAttribute : Attribute { }
Run Code Online (Sandbox Code Playgroud)
然后创建一个过滤器类作为IActionFilter
.
public class UserValidationFilter : IActionFilter
{
private readonly IRepository repository;
public UserValidationFilter(IRepository repository)
{
this.repository = repository;
}
public void OnActionExecuting(ActionExecutingContext filterContext)
{
//do something
}
public void OnActionExecuted(ActionExecutedContext filterContext)
{
//do something
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以用类似的东西注册它
private static void RegisterServices(IKernel kernel)
{
kernel.BindFilter<UserValidationFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<UserValidationAttribute>();
}
Run Code Online (Sandbox Code Playgroud)
如果属性本身具有构造函数参数,则可以将它们传递给
kernel.BindFilter<UserValidationFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<UserValidationAttribute>();
.WithConstructorArgumentFromActionAttribute<UserValidationAttribute>("myParameter", attr => attr.MyParameter);
Run Code Online (Sandbox Code Playgroud)
该BindFilter
语法的一部分Ninject.Web.Mvc.FilterBindingSyntax.
归档时间: |
|
查看次数: |
3464 次 |
最近记录: |