ASP.NET MVC 전편의 확장 방법, 체인 프로그래밍

ASP.NET MVC 전편의 확장 방법, 체인 프로그래밍
전언
다른 목적은 없고, 단지 몇 시에 ASP에 있는지 소개하는 것이다.NET MVC는 C# 언어의 특성을 사용하고 다른 자질구레한 지식도 있다. 한 범위를 강제로 나누면 모두 MVC와 관련이 있다고 할 수 밖에 없다. 어떤 것은 외곽의 지식이고 어떤 것은 틀 안에 포함된 것이다.MVC 학전편 글씨?익살스러운 성분도 있고 진실한 성분도 있기 때문에 일을 잘하려면 반드시 먼저 그릇을 이롭게 해야 한다.그릇이 뭐예요?기본은 MVC 프레임워크에 관련된 지식이 많다고 해서 제가 한 편 두 편으로 다 말할 수 있는 것도 아니지만 제가 할 수 있는 일은 아는 만큼 여러분과 공유하는 것입니다. 물론 시간이 지날수록 이 시리즈를 보완할 것입니다.
 
1 확장 방법
확장 방법은 C# 3.0 특성의 지식으로 Linq에서 가장 많이 사용되며 많은 검색 기능을 IEnumerable와 IEnumerable 유형에 추가했습니다. 여기서 너무 많이 말하지 않으면 Linq를 연결합니다.
운용하는 실제 장면: 하나의 쇼핑 리스트(카트) 대상이 있는데 추가, *** 리스트 안의 물품 기능을 포함한다.
상품 대상, 그것은 상품 명칭, 상품 가격의 두 가지 속성을 포함한다
코드 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      }

그리고 불안, 황공, 기대, 흥분의 새로운 수요가 왔다. 명세서는 명세서 내부의 모든 물품 가격의 합계를 제공할 수 있고 대상 구조를 파괴하지 않을 수 있도록 요구한다.맞습니다.이것은 매우 합리적인 요구이다. 지금 욕을 해도 소용없다. 왜냐하면 수요는 항상 알 수 없기 때문이다.초조하고 어쩔 수 없는 가운데 서광이 찾아왔다. 그것이 바로 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의 의존 유형을 더 높은 단계의 형식으로 바꾸고, 데이터를 필터하는 데 사용할 확장 방법을 추가하는 것이다.이로부터 모두 결합하면 하나의 체인식 프로그래밍 모델을 볼 수 있고 linq와 다른 지식을 배우는 데 좋은 밑받침이 된다.
수정된 ShoppingList 유형에 대한 코드 2-1 예제를 보겠습니다.
코드 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를 호출할 때, 검색 조건 (물품 추가 개수 58 이상) 을 입력했습니다. 이 확장 방법은 위에서 말한 IEnumerable 형식을 되돌려주고, 이어서 IEnumerable 형식의 확장 방법인 Total을 호출합니다.
여기에 간단한 체인 프로그래밍 모델이 나왔습니다. 관심 있는 친구는 이어서 linq를 깊이 이해할 수 있습니다. 물론 그 전에 제 후속 글을 보는 것이 중요합니다.
 
 

좋은 웹페이지 즐겨찾기