還有就是用構造器注入的方式。
首先,你有一個「空」一個,您將只作爲標記
public class UserValidationAttribute : Attribute { }
使用更換你的屬性然後創建一個過濾器類作爲一個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
}
}
然後你可以用類似
private static void RegisterServices(IKernel kernel)
{
kernel.BindFilter<UserValidationFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<UserValidationAttribute>();
}
註冊如果你的屬性本身具有構造函數的參數,你可以通過他們喜歡
kernel.BindFilter<UserValidationFilter>(FilterScope.Action, 0)
.WhenActionMethodHas<UserValidationAttribute>();
.WithConstructorArgumentFromActionAttribute<UserValidationAttribute>("myParameter", attr => attr.MyParameter);
的BindFilter
語法是一部分Ninject.Web.Mvc.FilterBindingSyntax。
只是一個註釋 - 普遍的共識似乎是屬性注入應該用於可選的依賴關係,但構造函數注入用於所需的依賴關係(哪種類型是有意義的 - 你不能構造沒有其所需的依賴項的類型,但屬性可能無法根據容器可用的服務注入) – Charleh
我現在已經實現了全局過濾器的方法,通過查看令牌屬性是否存在來檢查它是否適用。我目前沒有得到的是,當我在動作上使用token屬性並使用'filterContext.ActionDescriptor.IsDefined(typeof(MyTokenAttribute),true)'我得到'true'時,但如果我只將該令牌控制器上的屬性我得到'false'。 –