我不確定哪裏放置驗證(使用企業庫驗證塊)的最佳位置是?它應該在課堂還是在界面上?企業庫驗證塊 - 是否應該在類或接口上進行驗證?
事情,可能會影響它
- 驗證規則將不會在其從接口繼承的類來改變。
- 驗證規則不會在從類繼承的類中更改。
- 在大多數情況下,類會發生繼承 - 我懷疑一些邊緣情況從接口繼承(但我會盡量避免它)。
- 該接口的主要用途是用於使用Unity塊完成的DI。
我不確定哪裏放置驗證(使用企業庫驗證塊)的最佳位置是?它應該在課堂還是在界面上?企業庫驗證塊 - 是否應該在類或接口上進行驗證?
事情,可能會影響它
你試圖使用驗證塊與DI的方式,我不認爲它是一個問題,如果你設置接口級別的屬性。另外,我不認爲它會在繼承鏈中造成問題。但是,我主要看到這個塊在類級別使用,意圖保持接口不超過指定的東西。國際海事組織我沒有看到這樣做的一個很大的威脅。
爲了完整起見,我決定寫一個小測試,以確保按預期它會工作,這樣做,我只是張貼在這裏如果任何人希望它將來。
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; }
}
}
這裏非常小心,您的測試過於簡單。
,你期待SelfValidation校驗或類校驗,只爲簡單的屬性驗證就像你有沒有這將無法正常工作。
另外,如果你是在一個ASP.NET頁面,二不要使用PropertyProxyValidator;不敢相信它會工作,要麼,因爲它只是看起來字段驗證,而不是繼承/實現驗證...
是在VAB大洞,如果你問我..
您使用您的代碼示例什麼版本的企業庫的?我試過使用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);
這得到它爲我工作。