ASP.NET MVC学前編の拡張方法、チェーンプログラミング


ASP.NET MVC学前編の拡張方法、チェーンプログラミング

前言


目的は他にありませんが、ASPで何時か紹介します.NETMVCはC#言語の特性を使って、その他いくつかのこまごました知識点があって、強引に1つの範囲を区分すると、MVCと関係があるとしか言えなくて、あるのは周辺の知識で、あるのは枠組みの中に含まれています.MVC学前編の文字?ギャグの成分もあれば真実の成分もあるので、仕事をよくしようとすると、必ず器を利しなければならない.器は何ですか.基本的には、MVCの枠组みの中で多くの知识が含まれていると言っても、私が1篇2篇で话せるものではありませんが、私ができることはできるだけみんなと分かち合うことです.もちろん、时间が経つにつれてこのシリーズを改善します.
 

1拡張方法


拡張方法はC#3.0の特性の中の知識で、それが最も多くの地方でLinqの中で使うので、多くのクエリーの機能をIEnumerableとIEnumerableのタイプの中に追加して、ここではあまり言わないで、さもなくばLinqを引っ張ります.
運用の実際のシーン:ショッピングリスト(カート)オブジェクトがあり、リスト内のアイテムを追加、***する機能が含まれています.
商品名、商品価格の2つの属性を含む商品オブジェクト
コード1-1
 1 namespace BlogCase
 2     public class Commodity
 3     {
 4         public string Name { get; set; }
 5         public float Price { get; set; }
 6     }
 7     
 8     namespace BlogCase
 9     /// 
10     ///     
11     /// 
12     public class ShoppingList
13     {
14         private List _Commodities;
15 
16         public List Commodities
17         {
18             get { return _Commodities; }
19         }
20 
21         public ShoppingList()
22         {
23             _Commodities = new List();
24         }
25 
26         public bool AddCommodity(Commodity commodity)
27         {
28             _Commodities.Add(commodity);
29             return true;
30         }
31 
32         public bool RemoveCommodity(Commodity commodity)
33         {
34             if (_Commodities.Contains(commodity))
35             {
36                 _Commodities.Remove(commodity);
37                 return true;
38             }
39             else
40             {
41                 return false;
42             }
43         }
44      }

そして、この不安、恐ろしさ、期待、興奮の新しい需要が来て、リストに1つのリストの内部のすべての品物の価格の合計を提供することができて、対象の構造を破壊しません.はい、そうです.これは非常に合理的な需要で、今ののしっても何の役にも立たない.需要はいつも未知だからだ.焦り、しようがない中で曙光が訪れ、C#3.0の特性拡張方法です.
コード1-2を見て
コード1-2
 1 using BlogCase;
 2 using System.Linq;
 3 
 4 namespace BlogCase.Extension
 5 {
 6     public static class ShoppingListExtension
 7     {
 8         public static float Total(this ShoppingList shoppintlist)
 9         {
10             return shoppintlist.Commodities.Sum(commodity => commodity.Price);
11         }
12     }
13 }

ここではShoppingListExtensionタイプは静的クラスであり、静的メソッドTotalが定義されている.メソッドの署名はShoppingListタイプのパラメータであり、唯一異なるのはShoppingListタイプの前にthisキーワードが複数存在することである.このときShoppingListタイプの拡張メソッドは定義されている.次のサンプルコード1-3の使用を見てみましょう.
コード1-3
 1 using BlogCase.Extension;
 2 
 3 namespace BlogCase
 4 { 
 5     class Program
 6     {
 7         static void Main(string[] args)
 8         {
 9             ShoppingList shoppinglistTest = new ShoppingList();
10             shoppinglistTest.AddCommodity(new Commodity() { Name = "A", Price = 14.3f });
11             shoppinglistTest.AddCommodity(new Commodity() { Name = "B", Price = 15 });
12             shoppinglistTest.AddCommodity(new Commodity() { Name = "C", Price = 27.9f });
13             shoppinglistTest.AddCommodity(new Commodity() { Name = "D", Price = 34.3f });
14             Console.WriteLine(shoppinglistTest.Total().ToString());
15             Console.ReadLine();
16         }
17     }
18 }

ここで注目すべきは,拡張メソッドクラスShoppingListExtensionが存在するネーミングスペースを参照する必要があり,VS開発環境では拡張メソッドのアイコンも通常のメソッドとは異なる.図1のように
図1
コード1-3を実行します.結果は図2のようです.
図2

2チェーンプログラミング思想


上の内容はタイプを拡張して、拡張方法を追加して、このようにオブジェクト間の結合はやはり比較的に大きくて、もしShoppingListの内部構造を修正したら、ShoppingListExtensionのところも相応の修正をしなければならなくて、ここではなぜ面相抽象的にプログラミングして、後続の編幅に言及します.今私たちがしなければならないのは、ShoppingListExtensionの依存タイプをより高いレベルのタイプにシフトし、いくつかのデータをフィルタリングするための拡張方法を追加することです.これによってすべて結合して1つのチェーンプログラミングの模型を見ることができて、linqといくつかのその他の知識を学ぶことに対して、これはすべて良い敷き詰めです.
コード2-1の例を見てください.これは修正後のShoppingListタイプです.
コード2-1
 1 namespace BlogCase
 2 {
 3     public class ShoppingList : IEnumerable, IEnumerator
 4     {
 5         private List _Commodities = new List();
 6         public void Add(Commodity commodity)
 7         {
 8             _Commodities.Add(commodity);
 9         }
10         public IEnumerator GetEnumerator()
11         {
12             return this;
13         }
14         IEnumerator IEnumerable.GetEnumerator()
15         {
16             return this;
17         }
18         private int _index = -1;
19         public Commodity Current
20         {
21             get
22             {
23                 return _Commodities[_index];
24             }
25         }
26         public void Dispose()
27         {
28 
29         }
30         object System.Collections.IEnumerator.Current
31         {
32             get
33             {
34                 return Current;
35             }
36         }
37         public bool MoveNext()
38         {
39             if (_index  
  

ShoppingList , IEnumerable IEnumerator , IEnumerable ? Linq , IEnumerable , , 。

ShoppingListExtension , , , 。

2-2

 1 using BlogCase;
 2 using System.Linq;
 3 namespace BlogCase.Extension
 4 {
 5     public static class ShoppingListExtension
 6     {
 7         public static float Total(this IEnumerable shoppintlist)
 8         {
 9             return shoppintlist.Sum(commodity => commodity.Price);
10         }
11 
12         public static IEnumerable Filter(this IEnumerable shoppinglist, Func commodityFilter)
13         {
14             var commodities = shoppinglist.Where(commodityFilter);
15             return commodities;
16         }
17     }
18 }

されたShoppingListExtensionクラスでは、Total メソッドのタイプが され、Filter メソッドでは りタイプをIEnumerableタイプと し、パラメータタイプがFuncの であり、 にlambda で できるパラメータが されており、lambdaの については する.すべて した 、テスト のコードを てみましょう.
コード2-3
 1 using BlogCase.Extension;
 2 namespace BlogCase
 3 {
 4     class Program
 5     {
 6         static void Main(string[] args)
 7         {
 8             ShoppingList shoppinglistTest = new ShoppingList();
 9             shoppinglistTest.Add(new Commodity() { Name = "A", Price = 50.3f });
10             shoppinglistTest.Add(new Commodity() { Name = "B", Price = 60 });
11             shoppinglistTest.Add(new Commodity() { Name = "C", Price = 70.9f });
12             shoppinglistTest.Add(new Commodity() { Name = "D", Price = 80.3f });
13 
14             Console.WriteLine(shoppinglistTest.Filter(commodity=>commodity.Price>58).Total().ToString());
15             Console.ReadLine();
16         }
17      }
18 }

を 3に す
3
shoppinglistTest から メソッドFilterを び すと、 のIEnumerableタイプを し、 にIEnumerableタイプの メソッドTotalを び すクエリ (58より きい )が されます.
ここまで なチェーンプログラミングモデルが てきました. のある はlinqを く することができます.もちろん、その に の の を むことが です.