0

我正在構建與現有的Winforms應用程序共享模型對象的mvc web應用程序。我將VAB驗證引入其中。我需要驗證的一個項目是一個int,它可以是x個級別中的一個。將值注入到自定義VAB驗證程序中

我寫過一個LevelValidator,但它需要有可訪問的級別。

關於此代碼電話,它看起來像我應該注入LevelValidator而不是水平? 其他方式?

public class LevelValidatorAttribute : ValueValidatorAttribute 
{ 
    protected override Microsoft.Practices.EnterpriseLibrary.Validation.Validator DoCreateValidator(Type targetType) 
    { 
     LevelValidator validator = new LevelValidator(); 
     validator.Levels = this.Levels; 
     return validator; 
    } 

    [Dependency] 
    public Levels Levels { get; set; } 
} 

回答

1

不能對屬性使用依賴注入,因爲屬性不控制,並通過創建一個依賴注入框架,而是由CLR本身控制。嘗試有一個設計是你的屬性不需要依賴注入。

如果全部失敗,您可以使用LevelValidator內的服務定位符模式(最好將屬性全部保留),並調用LevelValidator類中的統一容器。爲了這個工作,你需要有一個靜態字段來保存容器。例如:

public class LevelValidator : Validator 
{ 
    public static UnityContainer Container { get; set; } 

    public LevelValidator() 
    { 
     this.Levels = Container.Resolve<Levels>(); 
    } 

    public Levels Levels { get; set; } 
} 

在應用程序的啓動路徑,你需要設置靜態Container屬性,如下所示:

public void Main() 
{ 
    var container = new UnityContainer(); 

    // configure it 

    LevelValidator.Container = container; 
} 

該解決方案是遠遠不夠理想,應該在大多數情況下被阻止。但是,創建屬性和LevelValidator不在Unity的控制之下。

+0

我相信這種類型的設計可以防止做基於配置的驗證。在這種情況下,VAB允許您攔截並替換某些部分,這允許您使用依賴注入來創建驗證器。但有一個警告:我已經瀏覽了VAB源代碼,並沒有找到一個簡單的方法來做到這一點。我希望你需要從'ConfigurationValidatorFactory'開始替換相當一部分的VAB基礎設施。我不會建議你在那上面花時間。 – Steven 2011-04-20 07:49:59

+0

非常感謝Steven! :) – 2011-04-20 09:54:03

+0

我結束了這個: '公共抽象類InjectedValueValidatorAttribute:ValueValidatorAttribute { public static IUnityContainer Container {get;組; ' }' – 2011-04-20 11:17:44

相關問題