1

検証 (Enterprise Library Validation Block を使用) を配置するのに最適な場所がどこにあるかわかりません。それはクラス上にあるべきですか、それともインターフェース上にあるべきですか?

影響を与える可能性のあるもの

  • インターフェイスから継承するクラスでは、検証規則は変更されません。
  • クラスを継承するクラスでは、検証規則は変更されません。
  • ほとんどの場合、クラスから継承が行われます - インターフェイスから継承する特殊なケースがいくつかあると思います (しかし、私はそれを避けようとします)。
  • インターフェイスの主な用途は、Unity ブロックで行われる DI です。
4

4 に答える 4

1

DIで検証ブロックを使用しようとしている方法は、インターフェイスレベルで属性を設定しても問題ないと思います。また、継承チェーンに問題が生じるとは思いません。ただし、このブロックがクラスレベルで使用されているのをほとんど見てきました。これは、インターフェースが過度に指定されないようにするためです。IMO これを行うことに大きな脅威があるとは思いません。

于 2009-01-19T20:22:30.743 に答える
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);

これでうまくいきました。

于 2012-04-05T18:49:59.907 に答える
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; }
}
}
于 2009-01-20T05:54:18.687 に答える