2009-01-19 71 views
1

我不確定哪裏放置驗證(使用企業庫驗證塊)的最佳位置是?它應該在課堂還是在界面上?企業庫驗證塊 - 是否應該在類或接口上進行驗證?

事情,可能會影響它

  • 驗證規則將不會在其從接口繼承的類來改變。
  • 驗證規則不會在從類繼承的類中更改。
  • 在大多數情況下,類會發生繼承 - 我懷疑一些邊緣情況從接口繼承(但我會盡量避免它)。
  • 該接口的主要用途是用於使用Unity塊完成的DI。

回答

1

你試圖使用驗證塊與DI的方式,我不認爲它是一個問題,如果你設置接口級別的屬性。另外,我不認爲它會在繼承鏈中造成問題。但是,我主要看到這個塊在類級別使用,意圖保持接口不超過指定的東西。國際海事組織我沒有看到這樣做的一個很大的威脅。

0

爲了完整起見,我決定寫一個小測試,以確保按預期它會工作,這樣做,我只是張貼在這裏如果任何人希望它將來。

using System; 
using Microsoft.Practices.EnterpriseLibrary.Validation; 
using Microsoft.Practices.EnterpriseLibrary.Validation.Validators; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
    static void Main(string[] args) 
    { 
     ISpike spike = new Spike(); 
     spike.Name = "A really long name that will fail."; 
     ValidationResults r = Validation.Validate<ISpike>(spike); 
     if (!r.IsValid) 
     { 
      throw new InvalidOperationException("Validation error found."); 
     } 

    } 
} 

public class Spike : ConsoleApplication1.ISpike 
{ 
    public string Name { get; set; } 
} 

interface ISpike 
{ 
    [StringLengthValidator(2, 5)] 
    string Name { get; set; } 
} 
} 
1

這裏非常小心,您的測試過於簡單。

,你期待SelfValidation校驗或類校驗,只爲簡單的屬性驗證就像你有沒有這將無法正常工作。

另外,如果你是在一個ASP.NET頁面,二不要使用PropertyProxyValidator;不敢相信它會工作,要麼,因爲它只是看起來字段驗證,而不是繼承/實現驗證...

是在VAB大洞,如果你問我..

0

您使用您的代碼示例什麼版本的企業庫的?我試過使用Enterprise Library 5.0,但它沒有奏效。

我跟蹤它到下面的代碼段瓦特/在EL5.0源碼:

[namespace Microsoft.Practices.EnterpriseLibrary.Validation] 
[public static class Validation] 

public static ValidationResults Validate<T>(T target, ValidationSpecificationSource source) 
{ 
    Type targetType = target != null ? target.GetType() : typeof(T); 
    Validator validator = ValidationFactory.CreateValidator(targetType, source); 
    return validator.Validate(target); 
} 

如果目標對象被定義,則target.GetType()將返回的最具體的類定義,而不是接口定義。

我的解決方法是更換您的線路:

ValidationResults r = Validation.Validate<ISpike>(spike); 

有了:

ValidationResults r ValidationFactory.CreateValidator<ISpike>().Validate(spike); 

這得到它爲我工作。