2013-09-25 31 views
10

我想找到一種方法來使用Ninject將構造函數依賴注入到過濾器。我發現了很多描述屬性注入的文章,現在建議不要這樣做,但是剩下的文章涉及工廠,定位器,全局封裝或存根屬性的複雜設置。使用Ninject過濾器構造函數注入

使用MVC可以覆蓋它的幾乎任何部分操作我原以爲這只是一個創建自己的過濾器提供程序的例子,它與您創建自己的依賴關係解析程序的方式類似。

什麼是現在正確的方法來允許注射,或者如果您使用某些類型的過濾器vs其他更容易嗎?

public class UserValidationAttribute : ActionFilterAttribute 
{ 
    private IRepository repository; 

    public UserValidationAttribute(IRepository repository) 
    { 
     this.repository = repository; 
    } 
} 
+1

只是一個註釋 - 普遍的共識似乎是屬性注入應該用於可選的依賴關係,但構造函數注入用於所需的依賴關係(哪種類型是有意義的 - 你不能構造沒有其所需的依賴項的類型,但屬性可能無法根據容器可用的服務注入) – Charleh

+0

我現在已經實現了全局過濾器的方法,通過查看令牌屬性是否存在來檢查它是否適用。我目前沒有得到的是,當我在動作上使用token屬性並使用'filterContext.ActionDescriptor.IsDefined(typeof(MyTokenAttribute),true)'我得到'true'時,但如果我只將該令牌控制器上的屬性我得到'false'。 –

回答

2

假設屬性是成爲元數據的一部分,這意味着,它應在被實例化編譯時間,所以不可能有任何IOC容器注入的屬性的庫。容器在運行時運行。

0

如果你想注入依賴到文件管理器,你想要使用屬性注入而不是構造器注入。

public class UserValidationAttribute : ActionFilterAttribute 
{ 
    [Inject] 
    private IRepository repository { get; set; } 

    public UserValidationAttribute() 
    { 
    } 
} 

https://stackoverflow.com/a/7192754/296861

+0

他的依賴是一個似乎需要的倉庫,所以它應該通過構造函數注入。另外,我覺得在你的課堂上散佈你的IoC魔法屬性是一個不好的模式。今天大多數IoC容器都支持注入MVC​​過濾器,包括Ninject,Unity v3和StructureMap –

18

還有就是用構造器注入的方式。

首先,你有一個「空」一個,您將只作爲標記

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

相關問題