より優雅なサーバー認証(.Net拡張方法の応用)


より優雅なサーバー認証(.Net拡張方法の応用)
背景
ENTLIBはVAIBがあることを知っています.大量のXMLが視力を損なうことを気にしないとVAIBはとても優雅です.でも、あまり大きくない項目の中で、多くの場合はまだ自分で検証コードを書いています.
NETは一年半以来、検証コードの各段階を書いて、個人的に優雅だと思う検証コードの書き方を展示しています.もし他の方案があれば、皆さんと共有してください.
第一段階--強写
強く書くということは、もちろん強制的に書いています.パラメータ検証が必要だと知ってから(恥ずかしいです.勉強しました.NETはまる1ヶ月でこのことを知っています.)、長い間検証コードを書いています.いつからこんなに書きにくいと思ったかは覚えていません.いつから他の方法に変えられました.つまり初期コードにはこのような断片が溢れています.
public void SomeMethod(string) s){    if (s) == null    {        throw new AgmentNull Exception("s")    }    if (s.Length == 0)    {        throw new Agment Exception("s cannot be empty ");    }}
最終的な結果は、一つ.csファイルにはまる1/2の内容が含まれています.これらのかわいいif、throwとかっこです.
この案は評価しなくてもいいです.自分で彼を卑下します.いくらなんでも、これらのもののために書いて、痙攣しました.つらいです.
第二段階--Gard類
うん、MSの多くの項目の中にこのGard類があります.いくつかの主要な検証の方法をクラスに書いて、方法は直接に異常を投げます.大体このようです.
public クラス Gard{    public void NotNull(object) value、 ストリングス argName)    {        if (value == null        {            throw new AgmentNull Exception(argName);        }    }    //その他の検証方法}
コールの仕方は大体こんな感じです.
public void SomeMethod(string) s){    Gard.NotNull(s、 "s");    Gard.NotEmpty(s、 s);    Gard.ShoterThan(s、 10, s);    Gard.LongerThan(s 3, s);    //その他のロジック
爽やかに見えます.if、throwと綺麗な括弧がありません.おめでとうございます.
しかし、すべてが素晴らしいわけではないです.毎回の呼び出し方法はパラメータの名前を表す文字列が必要です.ここには4つの「s」が書いてあります.もちろん4つの「s」は大丈夫です.でも、4つの「user.Name」を書いて、6つの「user.ration Date」を書きます.
何を感じていますか?手酸?NO~NO~これは一番重要ではないです.重要なのは文字列を書く時VS自動提示がないことです.10個のいい文字を保証できますか?
実はこの段階はとても感情的で、なんといっても「似たような機能を一緒にする」というコンセプトの試みです.
第三段階--拡張方法
そして、Cハ3.0があります.拡張方法があります.そして、Gardの方法の最初のパラメータにはthisが追加されています.呼び出しはこのようになります.
public void SomeMethod(string) s){    s.NotNull(「s」)    s.NotEmpty(「s」)    s.ShoterThan(10、 s);    s.LongerThan(3, s);    //その他のロジック
基本的には認めません.文法飴を使っているだけです.一番重要な文字列はパラメータ名を何度も入力しても問題は解決されていません.少し打つと楽しいですか?標準的なプログラマーとして、NO!
第四段階--分かりません.
今使っている方法です.発明したばかりです.個人的にはいい感じですが、どうやって設計から説明するか分かりません.まず実現案を書いてください.
むかしむかし、孤独なクラスがありました.Validation Helperといいます.彼の任務は世の中のすべての話を聞かないパラメータを処罰することです.彼を見た変数たちの説明によると、彼はこのような顔をしています.
public class ValidationHelper<T>
{
#region

private T m_Value;

private string m_Name;

#endregion

#region

///

/// .
///
public T Value
{
get
{
return m_Value;
}
}

///

/// .
///
public string Name
{
get
{
return m_Name;
}
}

#endregion

#region

///

/// .
///
/// .
/// .
public ValidationHelper(T value, string name)
{
m_Value
= value;
m_Name
= name;
}

#endregion

#region

///

/// .
///
/// this .
/// .
/// null.
public ValidationHelper<T> NotDefault()
{
if (Value.Equals(default(T)))
{
if (Value is ValueType)
{
throw new ArgumentException(
String.Format(
" {0} ", Name), Name);
}
else
{
throw new ArgumentNullException(
String.Format(
" {0} null", Name), Name);
}
}

return this;
}

///

/// .
///
/// .
/// this .
/// .
/// , .
public ValidationHelper<T> CustomRule(Action<T, string> rule)
{
rule(Value, Name);

return this;
}

#endregion
}
Validation Helperはパラメータの値とパラメータの名前を保存できるので、一気にパラメータ名を何度も入力する問題を解決しました.
しかし、多くの人が知らないのです.どうしてこんなに機能が少ないValidation Helperはほとんどの不規範パラメータを消滅させることができますか?実は秘訣は拡張方法にあります.拡張方法の連絡を通じて、Validation Helperは多くのパートナーを見つけました.范のstringのでしょう
public static class StringValidationHelper
{
///

/// .
///
///
/// .
public static ValidationHelper<string> NotEmpty(this ValidationHelper<string> current)
{
current.NotDefault();

if (current.Value.Length == 0)
{
throw new ArgumentException(
String.Format(
"{0} ", current.Name), current.Name);
}

return current;
}

///

/// .
///
///
/// ( ).
/// .
public static ValidationHelper<string> ShorterThan(this ValidationHelper<string> current, int length)
{
current.NotDefault();

if (current.Value.Length > length)
{
throw new ArgumentException(
String.Format(
"{0} {1}", current.Name, length), current.Name);
}

return current;
}

///

/// .
///
///
/// ( ).
/// .
public static ValidationHelper<string> LongerThan(this ValidationHelper<string> current, int length)
{
current.NotDefault();

if (current.Value.Length < length)
{
throw new ArgumentException(
String.Format(
"{0} {1}", current.Name, length), current.Name);
}

return current;
}

///

/// .
///
///
/// ( ).
/// ( ).
/// .
public static ValidationHelper<string> LengthBetween(this ValidationHelper<string> current, int minLength, int maxLength)
{
current.NotDefault();

if (current.Value.Length < minLength || current.Value.Length > maxLength)
{
throw new ArgumentException(
String.Format(
"{0} {1} {2} ", current.Name, minLength, maxLength), current.Name);
}

return current;
}
}
はい、仲間が見つけました.今の問題は、侠客の助けが必要な時に、私達はnewを使って侠客を呼び出さなければならないです.これは明らかに不愉快です.そのためにもう一つの拡張方法があります.私達は「工場」と呼びます.
public static クラス Validation{    public static Validation Helper<T> InitValidation<T>(this) T value、 ストリングス argName)    {        return new Validation Helper<T>(value、 argName);    }}
最後に、私達はこのように暗黒勢力を打ち負かしにきたのです.
public void SomeMethod(string) s){    s.InitValidation(「s」)        .Not Default()        .NotEmpty()        .ShoterThan(10)        .LongerThan(3);
どうせもっといい方法が見つけられません.よろしくお願いします.