Tài liệu hướng dẫn giảng dạy Net framework 3.5

doc 62 trang phuongnguyen 8550
Bạn đang xem 20 trang mẫu của tài liệu "Tài liệu hướng dẫn giảng dạy Net framework 3.5", để tải tài liệu gốc về máy bạn click vào nút DOWNLOAD ở trên

Tài liệu đính kèm:

  • doctai_lieu_huong_dan_giang_day_net_framework_3_5.doc

Nội dung text: Tài liệu hướng dẫn giảng dạy Net framework 3.5

  1. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội TÀI LIỆU HƯỚNG DẪN GIẢNG DẠY DÀNH CHO GIẢNG VIÊN .Net Framework 3.5 Page 1
  2. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Thông tin và mục tiêu khóa học Bộ giáo trình này được biên soạn dựa trên những tài liệu mới nhất về .NET framework 3.5 nhằm cung cấp cho sinh viên công nghệ thông tin những kiến thức cơ bản nhất về .NET framework. Nội dung bao gồm kiến trúc .NET framework, sự phát triển của .NET framework qua các phiên bản, kiến trúc phiên bản 3.5, các nội dung cơ bản trong phiên bản 3.5 Đặc biệt, giáo trình đi sâu vào Language Integrated Query (LINQ), Windows Presentation Foundation (WPF) là các công nghệ mới rất tiêu biểu của Microsoft .NET nhằm cung cấp cho sinh viên những kĩ năng cơ bản nhất để phát triển các ứng dụng trên nền .NET framework 3.5. Những mục tiêu chính mà giáo trình cố gắng đạt được: 1. Cung cấp cho sinh viên một cái nhìn tổng quan về kiến trúc .NET framework, nắm được sự phát triển qua từng phiên bản của .NET framework, so sánh các phiên bản. 2. Giúp sinh viên nắm được một số nội dung cơ bản trong .NET framework 3.5, sự khác biệt của nó so với các phiên bản trước. 3. Hướng dẫn cho sinh viên các kỹ thuật lập trình cơ bản với 2 công nghệ quan trọng là LINQ và WPF. Vì được bố cục trong 45 tiết dạy nên giáo trình không thể đi sâu vào chi tiết từng nội dung trong .NET framework mà chỉ dừng ở mức giới thiệu các khái niệm cơ bản nhất. Đối với phiên bản 3.5, giáo trình xoáy sâu vào 2 nội dung cơ bản là LINQ và WPF là các công nghệ thường gặp nhất đối với người lập trình trên .NET framework 3.5. Bộ giáo trình được biên soạn và tổng hợp bao gồm: slide bài giảng, bài exercise, bài thực hành lab và các Video tự học. Ở đây, toàn bộ giáo trình đều được trình bày bằng tiếng Anh, nhằm mục đích nâng cao khả năng tiếp thu và phát triển các kỹ năng học và nghiên cứu bằng tiếng Anh – các kỹ năng vô cùng quan trọng đối với người học công nghệ thông tin. Giáo trình có thể dùng tham khảo cho các ngành Công nghệ thông tin, điện tử, viễn thông. .Net Framework 3.5 Page 2
  3. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Phương pháp giảng dạy Khóa học này yêu cầu sinh viên phải được thực hành nhiều bằng các ví dụ, project thực tế để có khả năng làm thật thay vì chỉ nghe lý thuyết suông. Giáo viên nên tổ chức các buổi học lý thuyết và buổi học làm lab đan xen nhau, lý thuyết mà sinh viên mới học có thể được thể hiện ngay bằng các bài thực hành. Điều này giúp cho sinh viên nhớ và hiểu kỹ hơn những gì giáo viên truyền đạt, và cũng tăng sự hứng thú trong việc học. Một ví dụ về việc tổ chức các buổi học đã được áp dụng: Tổ chức tuần 3 tiết học lý thuyết và 1 buổi thực hành:  Lý thuyết - Số lượng tiết: 3 ( có thể thay đổi) - Thời gian giảng slide: từ 2 đến 2.5 tiết tùy vào chương và điều kiện. - Thời gian còn lại cho sinh viên nghe các Training Video và tiến hành thảo luận.  Thực hành - Sinh viên thực hành các bài lab của giáo trình. - Giáo viên tìm một ví dụ, tốt nhất là một project thực tế để làm thông qua các bài lab, hướng dẫn từng bước để sinh viên hiểu được quá trình làm thực tế. Kết thúc khóa học, giáo viên nên yêu cầu sinh viên thực hiện những project tổng thể bằng việc đưa ra danh sách các mẫu project để sinh viên lựa chọn, hoặc sinh viên tự đăng ký. Việc yêu cầu này có thể được thực hiện vào giữa học kỳ hoặc vào cuối kỳ. Để rèn luyện kỹ năng làm việc nhóm cho sinh viên, giáo viên có thể yêu cầu lớp phân chia thành các nhóm sinh viên để làm các project. Tùy vào độ lớn của project mà quy định số lượng thành viên của một nhóm, số lượng có thể giao động từ 2 đến 4 sinh viên. Khi bắt đầu thực hiện và trong quá trình thực hiện project, giáo viên cần có mặt để tham gia cùng sinh viên, hướng dẫn để sinh viên đi đúng hướng và hiểu vấn đề một cách chính xác. .Net Framework 3.5 Page 3
  4. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Đề cương môn học Giáo trình được biên soạn để giảng dạy trong 15 tuần, với thời lượng 3 tiếng một tuần cho phần lý thuyết và một buổi thực hành Lab. Trong thời gian học lý thuyết, việc đan xen cho sinh viên nghe các bài Trainning Video có thể tốn khá nhiều thời gian. Do đó giáo viên nên cân đối việc chia thời gian và chọn lọc các bài Video để cho sinh viên nghe và thảo luận trên lớp, còn những phần khác có thể giao cho sinh viên về nhà tự nghe rồi trả lời câu hỏi của giáo viên để buổi sau lên lớp trao đổi. Đề cương: .NET Overview Thời gian: 1 buổi Bài giảng : Chapter 1- .NET Overview Nội dung : 1.1 Introduction 1.2 Overview of the .Net flatform 1.3 Overview of the .Net Framework Summary Bài tập : Exercise 1 Common Language Runtime Thời gian: 1 buổi Bài giảng : Chapter 2: Common Language runtime Nội dung : 2.1 Introduction 2.2 CLR Executables 2.3 CLR in .Net framework 3.5 Summary Bài tập : Exercise 2 Bài Lab : Lab 2 .Net Framework 3.5 Page 4
  5. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội .NET framework 3.5 Thời gian: 1 buổi Bài giảng : Chapter 3: .NET framework 3.5 Nội dung : 3.1 Previous Versions 3.2 .Net framework 3.5 Summary Microsoft Language Integrated Query Thời gian: 4 buổi Bài giảng : Chapter 4: Microsoft Language Integrated Query Nội dung : 4.1 Introduction LINQ 4.2 C# and VB.NET language enhancements 4.3 LINQ building blocks 4.4 Querying objects in memory 4.5 Querying relational data 4.6 Manipulating XML 4.7 Extending LINQ 4.8 A look to futureSummary Bài tập : Exercise 4 Bài Lab : Lab 4 Video training Windows Presentation Foundation Thời gian: 4 buổi Bài giảng: Chapter 5: Windows Presentation Foundation Nội dung : 5.1 WPF Introduction 5.2 XAML 5.3 Programming WPF Applications 5.4 Building Your First WPF Application .Net Framework 3.5 Page 5
  6. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội 5.5 Exploring the Layout Controls 5.6 Working with XAML Controls 5.7 Working with Graphics, Media and Animations 5.8 New in WPF 3.5 5.9 Future Directions of WPFSummary Bài tập : Exercise 5 Bài Lab : Lab 5 Video training Windows Communication Foundation Thời gian: 2 buổi Bài giảng: Chapter 6: Windows Communication Foundation Nội dung : 6.1 Introduction 6.2 Programming Model 6.3 New in .NET framework 3.5 6.4 WCF Web Programming Model Summary Bài tập : Exercise 6 Bài Lab : Lab 6 Video training ASP.NET AJAX Thời gian: 2 buổi Bài giảng: Chapter 7: ASP.NET AJAX Nội dung : 7.1 Introducing ASP.NET AJAX 7.2 Microsoft AJAX Library 7.3 Working with Web Services 7.4 ASP.NET AJAX Control Toolkit 7.5 Building Web Application Summary Summary Bài tập : Exercise 7 Bài Lab : Lab 7 Video training .Net Framework 3.5 Page 6
  7. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội CHƯƠNG 1 .NET overview Chương này cung cấp cho sinh viên một cái nhìn tổng quan về kiến trúc .NET flatform và .Net framework. Sau đó sẽ mô tả từng thành phần quan trọng trong kiến trúc .Net framework nhằm giúp cho sinh viên có thể hình dung trong đầu các bộ phận cấu thành .Net framework để có thể dễ dàng hơn trong lập trình với công nghệ Microsoft .Net. Kế hoạch giảng Các nội dung cần truyền tải cho sinh viên: - Introduction  Introduction  Product groups - Overview of the .Net flatform  .NET flatform architecture  .NET flatform main components - Overview of the .NET framework  .NET framework design goals  Architecture  Components  Common language runtime  Framework base classes  Web Services, Web Forms, Windows Forms  Language Đây là chương mở đầu, giới thiệu một cách tổng quát về .Net framework. Với giáo trình .Net framework 3.5, không thể tập trung vào chi tiết từng thành phần cấu trúc của .Net framework mà chỉ có thể cung cấp cho sinh viên những khái niệm cơ bản nhất để có thể dễ dàng hình dung khi học các nội dung cơ bản trong phiên bản .Net framework 3.5. Với mục đích gieo vào đầu sinh viên những hình dung cơ bản nhất về .Net framework, giáo viên nên dẫn dắt sinh viên bắt đầu từ việc giới thiệu sự thành công của công ty Microsoft với công nghệ .Net để gợi trí tò mò, kích thích sinh viên tìm hiểu công nghệ .Net. Giáo viên giới thiệu tổng quan về .Net flatform với các nhóm sản phẩm chủ yếu, vai trò và chức năng của từng nhóm sản phẩm. Giáo viên nên demo trực tiếp việc lập trình với .Net flatform cho sinh viên thấy hứng thú hơn và các sinh viên chưa một lần tiếp xúc với công nghệ .Net dễ dàng có được những ý niệm về lập trình .net. Sau khi giới thiệu .Net flatform giáo viên tập trung vào .Net framework là nội dung .Net Framework 3.5 Page 7
  8. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội quan trọng nhất. Đối với phần Common language runtime (CLR) cần nhấn mạnh đây là thành phần quan trọng nhất trong .Net framework. Để sinh viên có thể dễ dàng hình dung hơn, có thể trình bày về sự so sánh CLR với các thành phần tương ứng với nó trong các ngôn ngữ khác, ví dụ như Java Virtual Machine (JVM) trong Java Đối với các thành phần khác, giáo viên nên chỉ rõ cho sinh viên xem trong Visual Studio nhằm giúp cho sinh viên dễ hiểu và hứng thú hơn. Phần Framework base classes, nên chỉ ra cho sinh viên thấy một số namespace cơ bản như System, System.Collections, System.IO Có thể chỉ cho sinh viên thấy nội dung các namespace này trong Visual Studio. Phần Data and XML, có thể có nhiều sinh viên chưa được làm quen với các khái niệm về XML, giáo viên có thể hướng dẫn qua khái niệm XML, các thành phần, các xử lý trong XML từ đó hướng dẫn sinh viên các namespace xử lý XML. Tương tự đối với phần Data. Giáo viên giải thích cho sinh viên khái niệm ADO.Net, có thể lấy ví dụ cụ thể để minh họa cho sinh viên. Đối với phần Web Services, Web Forms và Window Forms, giáo viên giải thích cho sinh viên các khái niệm Web Services, Web Forms, Window Forms, phân tích một số đặc điểm lập trình của từng loại và hướng dẫn sinh viên sử dụng các hỗ trợ của .Net framework. Giáo viên hướng dẫn sinh viên thấy rõ Framework base classes và Web Services, Web Forms, Windows Forms trong một số ví dụ đơn giản lập trình với Web Services, Web Forms và Window Forms. Đối với các sinh viên tham gia khóa học, có thể có những sinh viên đã nắm được các khái niệm cơ bản về .Net framework nhưng cũng có thể có những sinh viên chưa hề có ý niệm gì về .Net framework (có thể là những sinh viên chỉ quen lập trình với Java hay thậm chí là Pascal, C, C++ ). Giáo viên có thể thực hiện bài giảng bằng cách đặt câu hỏi cho những sinh viên đã biết trả lời, làm cho những sinh viên này hứng thú hơn. Việc nghe những câu trả lời từ những bạn đã sử dụng .Net có thể khiến các sinh viên còn lại dễ dàng tiếp thu bài giảng hơn. Thực hành: Bài tập về nhà: Exercise 1. .Net Framework 3.5 Page 8
  9. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội CHƯƠNG 2 Common language runtime Chương này trình bày thành phần trọng tâm, được ví như trái tim của .Net framework là Common language runtime (CLR). Sinh viên sẽ có được một hình dung cụ thể về cách tổ chức, thực thi code trong .Net. Không chỉ đơn thuần biết đến những dòng code trên những ngôn ngữ như C#, VB, VC++ nữa mà sinh viên sẽ nhìn thấy những gì diễn ra sau khi bấm nút run để dịch và chạy thử chương trình. Kế hoạch giảng Trong chương trước sinh viên đã được tìm hiểu một cách tổng quan nhất về .Net framework. Đến chương này, sinh viên sẽ được tìm hiểu thành phần quan trọng nhất, được ví như trái tim của .Net framework là Common language runtime (CLR). Nội dung chính cần truyền tải đến sinh viên: - Khái niệm CLR, vai trò và chức năng của nó. Nhấn mạnh tầm quan trọng của CLR trong .Net framework. - Sự thực thi của CLR:  Các đoạn mã viết bằng C#, VC++ hay VB sẽ được các trình biên dịch dịch ra dạng có thể thực thi được trong windows là exe hay dll tuân theo định dạng PE.  Trình bày cấu trúc định dạng file PE nhấn mạnh 2 thành phần là metadata và IL (code).  Các khái niệm cơ bản về metadata và IL.  Sau khi tìm hiểu về metadata và IL, đưa ra cho sinh viên những khái niệm cơ bản về Common Type System và Common Language Specification.  Sơ đồ quá trình thực thi của CLR  Mô tả các thành phần chính trong sơ đồ thực thi:  Class Loader  JIT Compiler - CLR trong phiên bản .Net framework 3.5 Đây là phần tương đối khó hiểu nên khi giảng bài, giáo viên nên kết hợp với demo ví dụ trên Visual Studio. Có thể lấy ví dụ trực tiếp trên một ngôn ngữ và yêu cầu sinh viên tự tìm hiểu trên các ngôn ngữ khác (Có thể làm bài tập về nhà). Giáo viên nên giảng rõ cho sinh viên về phần common type system vì đây cũng là một phần tương đối quan trọng đối với sinh viên khi lập trình. Các nội dung cần nhắc đến .Net Framework 3.5 Page 9
  10. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội trong phần Common Type System:  Value types  Reference types  Boxing and unboxing  Classes, properties, indexers  Interfaces  Delegates Thực hành: Lab 2. Giáo viên hướng dẫn sinh viên sử dụng Visual Studio, Microsoft Window SDK để làm bài tập thực hành tìm hiểu quá trình thực thi trong .Net framework. Bài tập về nhà: Exercise 2. .Net Framework 3.5 Page 10
  11. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội CHƯƠNG 3 .Net framework 3.5 Chương này trình bày các đặc điểm cơ bản của các phiên bản .Net framework trước đây (từ 1.0 đến 3.0), sau đó đưa ra sự so sánh các phiên bản này với nhau và với phiên bản 3.5. Cuối chương sẽ mô tả tổng quát các thành phần trong phiên bản .Net framework 3.5. Kế hoạch giảng Bài giảng sẽ lần lượt đi qua các phiên bản của .Net framework từ 1.0 cho đến 3.5. Giáo viên nên tách bài giảng thành 2 phần. Phần đầu là các phiên bản trước của .Net framework (từ 1.0 đến 3.0) và phần sau là phiên bản 3.5.  Các phiên bản trước của .Net framework: Giáo viên mô tả ngắn gọn từng phiên bản. Chú ý so sánh các cải tiến của phiên bản sau so với phiên bản trước. Đối với phiên bản 3.0: Nhấn mạnh đến các nội dung: - Windows Presentation Foundation (WPF) - Windows Communication Foundation (WCF) - Windows Workflow Foundation (WF) - Windows CardSpace Đối với các nội dung này, giáo viên cần chỉ ra những ưu điểm của công nghệ mới so với các công nghệ hiện có. Cần tạo ra được sự thu hút ban đầu đối với sinh viên.  Phiên bản 3.5: Giáo viên cho sinh viên xem hình vẽ mô tả các bước cải tiến của phiên bản 3.5 so với các phiên bản trước. Có thể đặt câu hỏi cho sinh viên xem đâu là các điểm nổi bật nhất. Đặc biệt chú trọng vào các nội dung: - LINQ - ASP.NET AJAX Trong nội dung LINQ nên mô tả lại một số thao tác thông thường khi làm việc với CSDL, XML rồi nói đến những ưu điểm của LINQ để sinh viên có thể thấy rõ những thuận tiện khi sử dụng công nghệ mới này. Đối với phần ASP.NET AJAX có thể có những sinh viên chưa được làm quen với web hoặc có những sinh viên đã làm việc với môi trường web nhưng lại chưa được tiếp xúc với công nghệ AJAX, giáo viên nên giới thiệu sơ qua về môi trường web cũng như công nghệ AJAX, những điểm hay của công nghệ này. Sau đó giới thiệu ASP.NET AJAX mà .Net framework 3.5 hỗ trợ. Đặc biệt nhấn mạnh đến những điểm hay của .Net Framework 3.5 Page 11
  12. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội công nghệ này để sinh viên có thể nắm được là tại sao nên sử dụng ASP.NET AJAX mà không phải là một công nghệ khác. Đối với các điểm mới khác có thể ra thành bài tập về nhà để sinh viên tự học hỏi, tìm tòi. Thực hành: Bài tập về nhà: .Net Framework 3.5 Page 12
  13. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội CHƯƠNG 4 Language INtegrated Query Chương này trình bày một công nghệ mới trong .Net framework 3.5 Language INtegrated Query (LINQ). LINQ cho phép tạo ra các phép toán truy vấn giống như các câu lệnh SQL trong các lớp của các ngôn ngữ .NET như VB hay C#. LINQ hỗ trợ truy vấn trong các in-memory collections như arrays, list, XML, DataSet và cơ sở dữ liệu quan hệ. Tuy nhiên LINQ có thể mở rộng truy vấn từ rất nhiều nguồn dữ liệu khác nhau. Chương này sẽ giới thiệu cho sinh viên một cái nhìn tổng quát về LINQ, tại sao nên sử dụng LINQ, hướng dẫn sinh viên sử dụng LINQ truy vấn với Object, Database và XML. Sau khi hướng dẫn lý thuyết cơ bản sẽ đặt ra cho sinh viên một số vấn đề nâng cao để giúp sinh viên hiểu sâu hơn về nội dung đã học. Kế hoạch giảng Đây là chương chính trong giáo trình với nội dung khá dài, giáo viên nên tách thành 4 phần. Mỗi phần sẽ giảng trong thời gian 3 tiết. Phần 1. Giới thiệu LINQ (part 1 đến part 3 trong giáo trình) Các nội dung chính cần truyền tải đến sinh viên: - Giới thiệu về LINQ  LINQ là gì?  Tổng quan về LINQ: Nhấn mạnh đến 2 khía cạnh bao gồm:  LINQ như một tập công cụ (toolset) để truy vấn đến các nguồn cơ sở dữ liệu. LINQ cung cấp LINQ to Object, LINQ to SQL và LINQ to XML.  LINQ như sự mở rộng ngôn ngữ: Cần nhấn mạnh, LINQ không phải là một ngôn ngữ mới mà được hiểu như là sự mở rộng của các ngôn ngữ đã có. Nó được tích hợp vào trong các ngôn ngữ như C# hay VB.  Các ưu điểm của LINQ: Cần nhấn mạnh việc nó xóa tan khoảng cách giữa Object, cơ sở dữ liệu quan hệ hay XML  Tại sao chúng ta nên sử dụng LINQ? - Các mở rộng trên các ngôn ngữ C# và VB: Trong phần này giáo viên nên luôn đưa ra sự so sánh giữa hai ngôn ngữ C# và VB để sinh viên có thể nhìn thấy rõ việc mở rộng với LINQ trên hai ngôn ngữ thông dụng này có gì giống và khác nhau. Giáo viên cần làm thế nào cho sinh viên nắm được cần biết những gì khi học LINQ với một ngôn ngữ nào đó. Khi ấy sinh viên có thể dễ dàng học với bất kể ngôn ngữ nào. Ở đây các nội dung chính cần nắm được khi học cách sử dụng LINQ với một ngôn ngữ là:  Implicitly typed local variables  Object initializers .Net Framework 3.5 Page 13
  14. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội  Lambda expressions  Extension methods  Anonymous types - LINQ building blocks: Các nội dung chính cần truyền tải cho sinh viên trong phần này bao gồm:  Standard query operator  Query expression  Expression tree  LINQ DLLs and namespaces Trong phần này giáo viên cần hướng dẫn cho sinh viên các phép toán truy vấn thông dụng, ý nghĩa của nó. Nếu sinh viên đã học qua SQL thì phần này có thể lướt nhanh hơn, trong trường hợp sinh viên chưa nắm rõ SQL thì giáo viên cần hướng dẫn kỹ để sinh viên có thể làm việc được với các phép toán này. Với nguyên liệu là các phép toán truy vấn, giáo viên hướng dẫn sinh viên cách thức xây dựng một expression. Trong phần LINQ dlls và các namespaces, giáo viên hướng dẫn cho sinh viên khi muốn tạo một ứng dụng có sử dụng LINQ trong Visual Studio thì cần ánh xạ đến các dll hay namespace nào. Trong phần giới thiệu này, để sinh viên hình thành ý niệm về LINQ, giáo viên nên demo cho sinh viên một số ví dụ nhỏ về sử dụng LINQ (có thể demo trên 3 ví dụ mở đầu về LINQ to object, LINQ to SQL và LINQ to XML) trên Visual Studio hoặc bằng video. Phần 2. LINQ to Object (part 4 trong giáo trình) Bắt đầu từ phần 2, nội dung giảng sẽ mang tính thực hành nhiều hơn. Những sinh viên đã sử dụng qua các ngôn ngữ .Net để phát triển ứng dụng có thể nắm bắt nội dung bài giảng dễ hơn các sinh viên khác. Trong quá trình giảng bài giáo viên có thể đưa ra vấn đề, hỏi những sinh viên đã biết .Net các giải pháp đã được thực thi trước đó, chỉ ra các hạn chế của nó để từ đó đưa ra giải pháp mới với LINQ. Ví dụ, có thể đặt câu hỏi: với các công nghệ trước đây, có thể truy vấn đến các object được không? Nếu có thì làm thế nào? Các nội dung chính cần truyền tải đến sinh viên: - Có thể dùng LINQ để truy vấn những gì? Cần nhấn mạnh cho sinh viên là ta không thể dùng LINQ để truy vấn được mọi thứ. ( Điều kiện để một object có thể được truy vấn bởi LINQ là: Nó thuộc kiểu collections và implements IEnumerable interface.) - Một số collection có thể được truy vấn nhờ LINQ:  Array  Generic lists  Generic dictionaries  String - Sử dụng LINQ với ASP.NET và Windows Forms: Nhấn mạnh đến phần data bindings cho các ứng dụng Web và các ứng dụng windows. Có thể có những sinh .Net Framework 3.5 Page 14
  15. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội viên chưa quen với việc tạo ứng dụng web và windows với .NET, giáo viên có thể nhắc lại việc tạo các ứng dụng web và windows để sinh viên có thể hiểu thêm được phần này. Đồng thời giáo viên nên demo cho sinh viên trên Visual Studio hoặc bằng video. - Một số phép toán dùng cho truy vấn:  Where  Select, select many  Distinct  aggregate operators  Sorting  Nested queries  Grouping  Join - Một số mở rộng:  Sử dụng LINQ với nongeneric collections  Grouping by multiple criteria  Dynamic queries Với thời lượng của tiết học có hạn nên giáo viên có thể chỉ cần đặt ra vấn đề, gợi ý hướng giải quyết và cho sinh viên tự tìm hiểu. Nếu còn thời gian nên cho sinh viên thảo luận. Đây là phần mang tính thực hành nhiều nên xen kẽ bài giảng giáo viên nên cho sinh viên xem nhiều demo để tăng tính trực quan. Phần 3. LINQ to SQL (part 5 trong giáo trình) Các nội dung chính cần truyền tải đến sinh viên: - Tại sao nên sử dụng LINQ to SQL thay vì ADO.net: Giáo viên cần nhấn mạnh các lợi thế của LINQ so với ADO.net ( như là giảm bớt xử lý cho hệ thống, không cần phải viết lại plumbing code ) để sinh viên thấy được tại sao nên sử dụng LINQ to SQL. Giáo viên nên lấy một ví dụ cụ thể, phân tích cách dùng ADO.net để thấy yếu điểm của nó để sinh viên cảm thấy hứng thú đối với công nghệ mới sắp học. Có thể có một số sinh viên đã nắm được ADO.net, giáo viên của thể hỏi ý kiến của họ để tăng tính tương tác cho bài giảng. - Jump into LINQ to SQL: Đây là phần hướng dẫn cách sử dụng LINQ to SQL qua một ví dụ cụ thể. Giáo viên hướng dẫn sinh viên từ lần lượt qua các vấn đề:  Đặt vấn đề: Giáo viên nêu bài toán – Cần liệt kê danh sách các quyển sách (Book) có giá <$30 và group chúng bằng tiêu đề (subject).  Tạo Cơ sở dữ liệu: Ở đây chỉ có một bảng duy nhất là Book  Tạo lập ánh xạ cơ sở dữ liệu – object (Setting up the object mapping)  Tạo lập DataContext (chú ý đến phần chuỗi kết nối, có thể có một số sinh viên chưa làm quen với cơ sở dữ liệu, giáo viên có thể hướng dẫn kĩ hơn). - Đọc dữ liệu từ Cơ sở dữ liệu với LINQ to SQL .Net Framework 3.5 Page 15
  16. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Phần này giáo viên có thể demo cho sinh viên qua Visual Studio hay video để sinh viên thấy rõ hơn. - Refining our queries: Hướng dẫn sinh viên biến đổi các câu truy vấn bằng cách sử dụng thêm một số tiến trình xử lý bên phía server. Các nội dung có thể giới thiệu gồm có:  Filtering  Sorting and grouping  Aggregation  Joining - When is my data loaded and why does it matter?  Lazy loading  Loading details immediately Đây là phần đặt vấn đề sâu hơn với LINQ to SQL để sinh viên suy nghĩ và tìm tòi. Do thời gian trên lớp có hạn, giáo viên có thể đặt ra vấn đề cho sinh viên suy nghĩ và thảo luận vào buổi sau. Vì đây là phần đòi hỏi sinh viên phải được thực hành thực tế rồi mới có thể nắm được rõ ràng nên giáo viên nên sử dụng làm câu hỏi về nhà. - Updating data:  Updating values and committing them to the database  Adding and removing items from a table Tương tự như phần đọc dữ liệu từ cơ sở dữ liệu, phần này cũng hướng dẫn một thao tác xử lý với Cơ sở dữ liệu nên giáo viên có thể tiến hành demo bằng visual studio hay video để tăng tính hiệu quả của bài giảng. - Mapping objects to relational data: Phần này hướng dẫn sinh viên một số cách để ánh xạ object và dữ liệu quan hệ. Giáo viên có thể đưa ra cho sinh viên một số lựa chọn:  Attributes declared inline with your classes  External XML files  The command-line SqlMetal tool  The graphical LINQ to SQL Designer tool Các lựa chọn này cũng có thể đưa ra làm bài tập về nhà cho sinh viên tìm hiểu. Nếu còn nhiều thời gian, giáo viên nên hướng dẫn sinh viên một cách cụ thể ít nhất một lựa chọn. - Advanced database capabilities: Phần này sẽ hướng dẫn sinh viên một số kĩ năng nâng cao với LINQ to SQL và Cơ sở dữ liệu. Các nội dung cần truyền đạt bao gồm:  SQL pass-through: Returning objects from SQL queries  Dynamic SQL pass-through  Dynamic SQL pass-through with parameters  Working with stored procedures  Using a stored procedure to return results  Returning a scalar value - Một số nội dung mở rộng khác: .Net Framework 3.5 Page 16
  17. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Kết thúc bài giảng, giáo viên nên gợi ý cho sinh viên một số hướng mở rộng, cách sử dụng nâng cao với LINQ to SQL để sinh viên có thể tự tìm tòi nghiên cứu, tăng thêm sự hứng thú đối với việc học và với các công nghệ mới. Một số hướng có thể gợi ý như: - Handling concurrency exceptions - Resolving conflicts using transactions - Working with User-defined functions - Phần 4. LINQ to XML (part 6 trong giáo trình) Extending LINQ (part 7 trong giáo trình) A look to future (part 8 trong giáo trình) Các nội dung chính cần truyền tải đến sinh viên: LINQ to XML - Why do we need another XML programming API? Trong phần này, giáo viên giới thiệu về XML, các API lập trình hiện có với XML. Một số sinh viên có thể chưa được tiếp xúc nhiều với XML. Giáo viên nên giải thích cặn kẽ cách tổ chức của một file định dạng XML. Định dạng XML có thể đem lại những lợi ích gì? Tại sao XML lại được sử dụng rộng rãi? Tất cả những giải thích này sẽ giúp sinh viên hiểu rõ hơn tầm quan trọng của LINQ to XML. Có thể lựa chọn một ví dụ cụ thể để giúp sinh viên hiểu tại sao nên sử dụng LINQ to XML. Ví dụ, có thể lựa chọn so sánh cách xử lý XML với DOM và LINQ to XML. - LINQ to XML class hierarchy Giới thiệu với sinh viên các lớp chính được định nghĩa trong LINQ to XML API. Giáo viên có thể nhấn mạnh vào một số lớp chính:  Xobject  Xnode  Xcontainer  Xelement  Xattribute - Working with XML using LINQ Sau khi hướng dẫn sinh viên tìm hiểu một số lớp trong LINQ to XML API, giáo viên hướng dẫn sinh viên sử dụng XML to LINQ trong một số các thao tác cơ bản:  Loading XML  Parsing XML  Creating XML  Creating XML documents  Adding content to XML  Updating XML content  Working with attributes .Net Framework 3.5 Page 17
  18. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội  Saving XML Đây là một số thao tác cơ bản thường gặp khi xây dựng các ứng dụng xử lý với XML. Để bài giảng thêm sinh động, giáo viên có thể lồng ghép các thao tác này trong một ví dụ cụ thể, có thể demo bằng visual studio hoặc video. - Query XML with LINQ to XML Như đã nhắc đến ở trên, LINQ dùng để truy vấn các nguồn dữ liệu và LINQ to XML chính là để thực hiện mục đích truy vấn đến các dữ liệu ở định dạng XML. Trong phần này, cần truyền đạt đến sinh viên 2 nội dung chính là:  LINQ to XML axis methods: Giới thiệu cho sinh viên một số phương thức cung cấp cho chúng ta khả năng tìm kiếm elements, attributes, và nodes mà chúng ta muốn làm việc trong XML. Các phương thức cơ bản gồm có:  Element  Attribute  Elements  Descendants  ElementsAfterSelf,  NodesAfterSelf  ElementsBeforeSelf  NodesBeforeSelf  Standard query operators: Giới thiệu cho sinh viên một số toán tử truy vấn cơ bản để thực hiện việc truy vấn. Một số toán tử quan trọng cần đề cập đến bao gồm:  Projecting with Select  Filtering with Where  Ordering and grouping  Querying LINQ to XML objects with XPath: Giới thiệu với sinh viên cách sử dụng XPath để truy vấn các đối tượng XML. XPath là một khái niệm mà có thể rất nhiều sinh viên chưa được tiếp xúc. Giáo viên nên giới thiệu qua khái niệm XPath là gì, dùng để làm gì và có lợi ích gì. Từ đó giáo viên lấy ví dụ hướng dẫn cách sử dụng XPath để truy vấn các đối tượng XML cho sinh viên. XPath là một vấn đề khá hay, giáo viên có thể sử dụng như bài tập về nhà để sinh viên tìm hiểu, nghiên cứu. Extending LINQ Sau khi tìm hiểu hết các nội dung cơ bản của LINQ, phần này sẽ đưa ra một số vấn đề mở rộng. Giáo viên có thể đặt ra một số vấn đề: - Suggested use cases for LINQ’s extensibility Một số trường hợp sử dụng mở rộng của LINQ. Ở đây có thể kể một số trường hợp:  Querying a custom data source  Querying web services  Allowing the developers who use your product to take advantage of LINQ .Net Framework 3.5 Page 18
  19. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Giáo viên có thể phân tích tính khả thi và gợi ý ý tưởng thực hiện cho sinh viên để sinh viên có thể tự tìm tòi, nghiên cứu. Có thể lấy một ví dụ cụ thể để trình bày cho sinh viên: Example - Querying a web service: LINQ to Amazon. - Creating custom query operators A look to future Đây là phần trình bày một số hướng phát triển trong tương lai của LINQ nhằm trình bày cho sinh viên tiềm năng phát triển của LINQ đồng thời có thể giúp gợi ý hướng nghiên cứu tiếp theo cho những sinh viên có niềm đam mê. Một số vấn đề có thể trình bày trong phần này gồm có: - LINQ to XSD, the typed LINQ to XML - PLINQ: LINQ meets parallel computing - LINQ to Entities, a LINQ interface for the ADO.NET Entity Framework Thực hành: Lab 4. Bài tập về nhà: Exercise 4. .Net Framework 3.5 Page 19
  20. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội CHƯƠNG 5 Windows Presentation Foundation Chương này trình bày một công nghệ mới đã xuất hiện từ .Net framework 3.0 nhưng vẫn chiếm một vị trí quan trọng trong .Net framework 3.5. Windows Presentation Foundation (WPF) đưa ra một hướng tiếp cận thiết kế, xây dựng giao diện tương tác người dùng mới sử dụng XAML. Đây là một công nghệ rất mạnh, có khả năng tương tác tốt với media, animation và đồ hoạ 2D/3D. Chương này sẽ lần lượt giới thiệu cho sinh viên tổng quan về WPF, XAML, giới thiệu cách lập trình với WPF, các control, layout, đồ họa, animation, 2D/3D Kế hoạch giảng Đây là chương chính trong giáo trình với nội dung khá dài, giáo viên nên tách thành 4 phần. Mỗi phần sẽ giảng trong thời gian 3 tiết. Phần 1. WPF Introduction (part 1 trong giáo trình) XAML (part 2 trong giáo trình) WPF Introduction: Đây là phần đầu tiên, mang tính chất giới thiệu sơ qua với sinh viên về WPF. Trong phần này mục tiêu đặt ra cho giáo viên là phải giúp sinh viên nắm được WPF là cái gì? Dùng WPF để làm gì? Tại sao nên sử dụng WPF chứ không phải là một công nghệ khác? Đặc trưng của ứng dụng WPF khác với các ứng dụng trước đó là gì? Các nội dung chính cần truyền tải đến sinh viên: - Presentation Layer Architecture: From Yesterday to Tomorrow Phần này trình bày về lịch sử kiến trúc tầng trình diễn của các ứng dụng từ trước đến nay và các xu hướng tiếp theo. Điểm mấu chốt giáo viên cần trình bày với sinh viên là: Với kiến trúc Client – Server phổ biến hiện nay, WPF là một giải pháp mới, hấp dẫn, nên được xem xét trong việc xây dựng giao diện tương tác người dùng trên Client. - Windows Presentation Foundation (WPF)  WPF Features and Machinery  WPF – Architecture  Tools of the Trade Trong phần này giáo viên giới thiệu cho sinh viên kiến trúc WPF, các đặc điểm của nó. Cần nhấn mạnh đến các nội dung quan trọng sẽ được học trong các phần tiếp theo: XAML, control, layout, databinding, media .Net Framework 3.5 Page 20
  21. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Trong phần tools, giáo viên giới thiệu với sinh viên các công cụ cần thiết để có thể xây dựng ứng dụng WPF. Để tăng thêm tính hấp dẫn của công nghệ mới đối với sinh viên, giáo viên có thể cho sinh viên xem một số ứng dụng làm theo công nghệ WPF đã có. Ví dụ: XAML: Trước khi học kĩ hơn về WPF, sinh viên nên học một nội dung về XAML. Giáo viên có thể giới thiệu với sinh viên lập trình ứng dụng với WPF sẽ gắn chặt với XAML như thế nào để sinh viên có thể hiểu tại sao cần phải nắm được XAML. Các nội dung cần truyền tải đến sinh viên: - What is XAML? - Why do we need XAML? - Working with XAML:  XAML vs. Code  Attributes and Events  Nesting elements  XAML Namespaces  Type Converters  Property-Element Syntax  Markup Extensions  The Content Property  Nesting rules  Naming Elements  XAML Code Generation Giáo viên cần hướng dẫn sinh viên hiểu khái niệm XAML và cách thực hiện một số thao tác cơ bản với XAML. Trong phần hướng dẫn cách làm việc với XAML giáo viên nên demo trên Visual Studio hoặc bằng video. Kết thúc phần này, mục tiêu đặt ra là sinh viên có thể cảm thấy không lạ lẫm với XAML. Khi chuyển đến các phần lập trình với WPF sinh viên sẽ không bị bỡ ngỡ và có thể nhanh chóng tiếp thu bài giảng. Phần 2. Programming WPF Applications (part 3 trong giáo trình) Building Your First WPF Application (part 4 trong giáo trình) Sau khi học phần giới thiệu và XAML, phần này sẽ hướng dẫn sinh viên những bước cơ bản đầu tiên lập trình với WPF. Các nội dung cần truyền tải đến sinh viên: - What Are WPF Applications? Phần này giới thiệu cho sinh viên về các ứng dụng WPF. Một điểm cần nhấn mạnh ở đây là thay vì các windows forms, ứng dụng WPF là một tập các trang XAML. Trong .Net Framework 3.5 Page 21
  22. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội công nghệ WPF, các trang XAML được thay thế cho các windows form. Ta có thể vừa sử dụng các control kéo thả vừa có thể chỉnh sửa mã XAML.  XAML applications can run in one of two ways Trình bày các cách chạy ứng dụng XAML. Có 2 cách là:  XAML browser applications  Installed applications - Windows Presentation Foundation Architecture  Giới thiệu 3 thành phần trong kiến trúc của WPF là:  Presentation Core  Presentation Framework  Milcore  The major classes that WPF uses: Giáo viên giới thiệu với sinh viên một số lớp cơ bản mà WPF sử dụng. Có thể chỉ ra một số lớp như sau:  System.Threading.DispatcherObject  System.Windows.DependencyObject  System.Windows.Media.Visual  System.Windows.UIElement  System.Windows.FrameworkElement - How to Program WPF Applications Phần này hướng dẫn cho sinh viên cách lập trình với điều khiển ứng dụng.  Using the Application Object Application Object là đối tượng quan trọng, quản lý ứng dụng của bạn như một tập hợp các trang XAML.  Accessing Properties: Giáo viên hướng dẫn sinh viên cách truy cập vào các thành phần thuộc tính của ứng dụng qua Application Object.  Handling Events: Giáo viên hướng dẫn sinh viên cách “bắt” các sự kiện liên quan đến ứng dụng. Ví dụ:  Activated Event  Deactivated Event  SessionEnding Event  Supporting Application-Level Navigation Events: o Navigating o NavigationProgress o Navigated o LoadCompleted Giáo viên nên hướng dẫn sinh viên bằng cách demo trên Visual Studio hoặc qua video.  Window Management  Using the Window Object  Using the NavigationWindow Object  Using the Page Object .Net Framework 3.5 Page 22
  23. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Trình bày cho sinh viên cách sử dụng một số đối tượng khác trong Window Management. - Building Your First WPF Application Phần này giáo viên demo cho sinh viên cách tạo một ứng dụng WPF với Visual Studio. Giáo viên cần giới thiệu cho sinh viên khi nhìn thấy trực quan từng bước khi tạo một ứng dụng WPF. Sinh viên cần nắm được các file được tạo ra khi tạo một ứng dụng WPF. Phần 3. Exploring the Layout Controls (part 5 trong giáo trình) Working with XAML Controls (part 6 trong giáo trình) Các nội dung cần truyền đạt cho sinh viên: Exploring the Layout Controls Bản chất của WPF là tạo giao diện tương tác người dùng nên layout tool là một phần rất quan trọng. Một số kiểu layout cơ bản: - A StackPanel - A DockPanel - A Grid - A Canvas - A WrapPanel Giáo viên hướng dẫn sinh viên thấy được đặc điểm của từng loại, gợi ý các trường hợp sử dụng từng loại panel. Cách truyền đạt tốt nhất là giáo viên demo trực tiếp trên Visual Studio hoặc video. Working with XAML Controls Một phần rất quan trọng nữa trong phần thiết kế giao diện là các control. Ở đây là các XAML control. Giáo viên cần hướng dẫn cho sinh viên cách sử dụng một số control cơ bản thường gặp như là: - Button Control - CheckBox Control - ComboBox Control Giáo viên nên hướng dẫn thật cẩn thận một vài control. Từ cách thiết kế các thuộc tính giao diện đến “bắt” các sự kiện. Có thể hướng dẫn trên Visual Studio. Chẳng hạn với ComboBox Control:  Giáo viên hướng dẫn sinh viên cách thêm dữ liệu vào trong control. Ở đây có thể sử dụng mã XAML. Giáo viên chỉ cho sinh viên cách xem mã XAML của control để thêm các tùy biến của mình vào.  Giáo viên hướng dẫn sinh viên cách “bắt” một số sự kiện tiêu biểu của comboBox, ví dụ: .Net Framework 3.5 Page 23
  24. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội  DropDownOpened Event  DropDownClosed Event  Handling Selection Changes  Handling Mouse Moves Có thể có một số sinh viên chưa nắm được khái niệm “bắt” sự kiện, giáo viên nên giới thiệu qua và chỉ ra trên ngay trên ví dụ cách thực thi của việc “bắt” sự kiện. - Performing Data Binding with XAML Controls Giáo viên trình bày cho sinh viên khái niệm data binding. Đây là một vấn đề khá quan trọng trong lập trình ứng dụng. Khi ứng dụng của chúng ta làm việc với các nguồn dữ liệu thì cần phải binding nó với các control để tương tác với người sử dụng. Một số nội dung cần truyền đạt đến sinh viên:  XML Binding Binding từ dữ liệu XML. Một đặc tính rất mạnh của binding dữ liệu trong WPF là khả năng binding một hay nhiều control đến nguồn dữ liệu XML.  Object Data Source Binding Binding dữ liệu từ cơ sở dữ liệu. Đây là công việc truyền thống mà rất nhiều lập trình viên phát triển ứng dụng phải thực hiện. Trong phần này giáo viên nên hướng dẫn cụ thể cho sinh viên qua Visual Studio hay qua video. Phần 4. Working with Graphics, Media and Animations (part 7 trong giáo trình) New in WPF 3.5 (part 8 trong giáo trình) Future Directions of WPF (part 9 trong giáo trình) Các nội dung cần truyền đạt cho sinh viên: Working with Graphics, Media and Animations - Introducing the Graphics APIs WPF cung cấp một thư viện các hàm API hỗ trợ các xử lý đồ họa. Giáo viên hướng dẫn cho sinh viên cách sử dụng một số hàm API cơ bản:  Brushes  Shapes  Transformations  Imaging  Animations - Using Multimedia Nhấn mạnh core của Multimedia trong WPF nằm trong lớp MediaElement . Giáo viên hướng dẫn sinh viên cách sử dụng lớp MediaElement qua một ví dụ cụ thể. - Working with Animation .Net Framework 3.5 Page 24
  25. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Đây là phần hướng dẫn cách làm việc với animation. Các nội dung cần truyền tải đến cho sinh viên bao gồm:  Understanding the Animation Types  Using Keyframe-Based Animation  Animations Using Storyboards and TimeLine Classes  Working with Animation and Timelines with Interactive Designer  Assigning Animations to Events in Interactive Designer Animation là một phần tương đối lạ đối với nhiều sinh viên. Giáo viên cần giải thích rõ cho sinh viên các loại animation, khái niệm keyframe và timeline. Có thể gợi ý cho sinh viên liên tưởng đến cách làm Flash để dễ hình dung hơn. Trong phiên bản Visual Studio 2008, giáo viên hướng dẫn sinh viên cách làm việc với animation trong Interactive Designer, cách gán các animation cho các sự kiện. Giáo viên có thể sử dụng một sản phẩm đã chuẩn bị trước từ nhà để demo cho sinh viên thấy tính hấp dẫn của đặc tính hỗ trợ animation mạnh mẽ của WPF. New in WPF 3.5 (part 8 trong giáo trình) Phần này sẽ trình bày các điểm mới của WPF trong .Net framework 3.5. So sánh WPF trong phiên bản .Net framework 3.5 với WPF trong phiên bản .Net framework 3.0. Một số nét mới có thể giới thiệu với sinh viên gồm có:  Applications  Graphics  3-D Graphics  Data Binding  Controls  Documents  Annotations Trong phần này giáo viên có thể yêu cầu sinh viên về nhà tìm hiểu thêm các đặc điểm mới của WPF 3.5. Có thể yêu cầu sinh viên kiểm chứng bằng lập trình thực tế, cũng có thể hình thành các nhóm thực nghiệm, kiểm tra các đặc điểm mới của WPF 3.5. Future Directions of WPF Phần cuối cùng sẽ trình bày một số hướng phát triển tương lai của WPF. Các nội dung cần trình bày cho sinh viên gồm có: - Advantages and Disadvantage WPF Phân tích một số ưu điểm và khuyết điểm của WPF để từ đó dễ dàng hơn trong việc đánh giá các xu thế tương lai của công nghệ này. - WPF and Windows Vista Window Vista là hệ điều hành window mới nhất của Microsoft. Việc đánh giá WPF và Window Vista là một nội dung cần thiết. - WPF and XAML - WPF and Silverlight .Net Framework 3.5 Page 25
  26. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Silverlight là một công nghệ Là một plug-in của trình duyệt, Silverlight mang sức mạnh âm thanh và video cải tiến đến với các ứng dụng Web. Nó cũng được coi là lời phúc đáp của Microsoft với công nghệ Flash đang rất phổ biến của đối thủ Adobe. WPF và Silverlight liên hệ mật thiết với nhau. Phần giới thiệu Silverlight và WPF sẽ giúp sinh viên tiếp cận với một công nghệ mới, đầy tiềm năng. Thực hành: Lab 5. Bài tập về nhà: Exercise 5. .Net Framework 3.5 Page 26
  27. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội CHƯƠNG 6 Windows Communication Foundation Chương này trình bày công nghệ Windows Communication Foundation (WCF) là một bộ công cụ hỗ trợ thực hiện ứng dụng theo kiến trúc hướng dịch vụ (SOA). WCF được xuất hiện từ phiên bản 3.0 và cũng giống như WPF nó vẫn là một thành phần quan trọng trong phiên bản .Net framework 3.5. Nội dung của chương này bao gồm giới thiệu về WCF, cách sử dụng WCF, trình bày một số điểm mới của WCF trong phiên bản .Net framework 3.5. Kế hoạch giảng Đây là chương có nội dung khá dài, giáo viên nên tách thành 2 phần. Mỗi phần sẽ giảng trong thời gian 3 tiết. Phần 1. Introduction (part 1 trong giáo trình) Programming Model (part 2 trong giáo trình) Introduction Các nội dung cần truyền đạt cho sinh viên: Đây là phần giới thiệu, giúp sinh viên có được cái nhìn tổng quan về WCF. Giáo viên cần trình bày cho sinh viên các nội dung: WCF là gì? Tại sao nên sử dụng WCF? Lợi ích của việc sử dụng công nghệ này?  What is WCF? Cần nhấn mạnh lại cho sinh viên, WCF là một bộ công cụ dùng để phát triển nhanh các ứng dụng theo kiến trúc hướng dịch vụ.  WCF Design Goals  Basic conceptions: Trình bày một số khái niệm cơ bản trong kiến trúc hướng dịch vụ của WCF. Các khái niệm bao gồm:  WCF Clients and Services  WCF Message Patterns  WCF Messaging and Endpoints  Address, Binding, Contract  Messaging Runtime Cần làm rõ cho sinh viên hiểu quá trình truyền message giữa client và server. Cấu trúc của message và message runtime. .Net Framework 3.5 Page 27
  28. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội  WCF Communication Protocols: Trình bày các giao thức truyền thông của WCF. Nhấn mạnh WCF có thể hỗ trợ nhiều giao thức truyền thông: HTTP, TCP, MSMQ , hỗ trợ encoding đối với message.  WCF Architecture: Giáo viên trình bày cho sinh viên kiến trúc của WCF. Có thể cho sinh viên quan sát rồi trả lời các thành phần chính trong kiến trúc. Cuối cùng giáo viên đưa ra kết luận các thành phần chính trong kiến trúc WCF:  WCF Contracts  WCF Policies and Bindings  WCF Service Runtime  WCF Messaging Channels  WCF Hosting and Activation Programming Model Phần này trình bày mô hình lập trình với WCF. - From Objects to Services: OO or SO Giáo viên xuất phát từ mô hình lập trình hướng đối tượng (Object – Oriented) cho đến lập trình hướng dịch vụ (Service – Oriented) để trình bày cho sinh viên thấy đặc điểm của từng mô hình lập trình, xu thế hiện nay. Các mô hình lập trình có thể kể ra gồm có:  Object-Oriented: với đặc trưng là Polymorphism, Encapsulation, Subclassing  Component-Based: với đặc trưng là Interface-based, Dynamic Loading, Runtime Metadata  Service-Oriented: với đặc trưng là Message-based, Schema+Contract, Binding via Policy - WCF Programming Phần này hướng dẫn cách lập trình với WCF. Giáo viên nhấn mạnh các bước lập trình ứng dụng với WCF:  Create a WCF Service  Adapt and Configure the Service Contract  Run the Service  Create a WCF Client  Configure the WCF Client  Use the WCF Client Với mỗi bước, giáo viên nên có những hướng dẫn bằng hình ảnh cụ thể hoặc demo qua Visual Studio hay video. Phần 2. New in .NET framework 3.5 (part 3 trong giáo trình) HTTP programming Model (part 4 trong giáo trình) New in .NET framework 3.5 Phần này trình bày các điểm mới của WCF trong phiên bản .Net framework 3.5. Một số đặc điểm mới có thể kể ra như: .Net Framework 3.5 Page 28
  29. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội - WCF and WF Integration-Workflow Services - WCF Web Programming Model - WCF Syndication - WCF and Partial Trust - WCF and ASP.NET AJAX Integration - Web Services Interoperability Giáo viên nên mô tả sơ qua từng đặc điểm mới trong .Net framework 3.5. Chú ý nhấn mạnh một số điểm mới sẽ được trình bày kỹ hơn trong phần sau như: Http Programming Model và JSON service. WCF Web Programming Model Đây là một điểm mới trong .Net framework 3.5, cho phép xây dựng các Web-style services với WCF. Giáo viên chia các nội dung cần truyền đạt cho sinh viên thành 2 phần: - Overview: Đưa ra một cái nhìn tổng quan về WCF Web Programming Model. Các kiến thức chính bao gồm:  Introduction  URI Processing with UriTemplate and UriTemplateTable: Giáo viên giải thích cho sinh viên khái niệm URI, UriTemplate và UriTemplateTable.  Service Operation Parameters and URLs  WebGet and WebInvoke: Web Programming Model cho phép lập trình viên điều khiển các mệnh lệnh bound đến URI và các phương thức HTTP liên quan đến URI này thông qua WebGet and WebInvoke.  Formats and the Web Programming Model: một đặc điểm mới của Web Programming Model là có khả năng làm việc với rất nhiều kiểu dữ liệu khác nhau. Ở tầng binding, WebHttpBinding có thể đọc và ghi dữ liệu với các kiểu dữ liệu như XML, JSON, Opaque binary streams. JSON là một kiểu dữ liệu mới, có thể hầu hết sinh viên đều chưa được tiếp xúc, giáo viên có thể giới thiệu qua cho sinh viên để thấy được một vấn đề mới, hấp dẫn, kích thích sự tìm tòi của sinh viên. HTTP Programming Model HTTP Web Programming Model cho phép các lập trình viên phát triển Windows Communication Foundation (WCF) Web services qua các HTTP request cơ bản mà không cần đến SOAP. Trong phần này giáo viên giới thiệu cho sinh viên tổng quan về HTTP Web Programming Model sau đó trình bày một số lớp cơ bản được cung cấp trong mô hình này: - Programming Model:  WebGetAttribute  WebInvokeAttribute  WebServiceHost .Net Framework 3.5 Page 29
  30. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội - Channels and Dispatcher Infrastructure:  WebHttpBinding  WebHttpBehavior - Utility Classes and Extensibility Points:  UriTemplate  UriTemplateTable  QueryStringConverter  WebHttpDispatchOperationSelector Sau khi giảng xong các lớp này, giáo viên giới thiệu với sinh viên một ví dụ demo. Vì thời gian dành cho bài giảng này là khá ngắn mà tiếp xúc với một công nghệ rất mới mẻ nên vấn đề đặt ra cho giáo viên là phải làm cho sinh viên nắm được WCF là gì? nắm được tư tưởng lập trình với WCF, một số điểm mới trong .Net framework 3.5 đặc biệt là HTTP Programming Model. Đây không phải là công nghệ thường gặp nhất đối với người lập trình viên nên trong khuôn khổ 45 tiết của giáo trình chúng ta không đặt nặng nội dung này. Tuy nhiên cần phải cho sinh viên nắm được cái hay của công nghệ để khi cần thiết sinh viên có thể dễ dàng tự tìm tòi, nghiên cứu và phát triển. Thực hành: Lab 6. Bài tập về nhà: Exercise 6. .Net Framework 3.5 Page 30
  31. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội CHƯƠNG 7 ASP.NET AJAX Chương này trình bày một nội dung mới trong .NET framework 3.5 - ASP.NET AJAX. ASP.Net AJAX cho phép các lập trình viên tạo ra những giao diện web với những thành phần Ajax có thể dùng lại được. Trong đó AJAX là một công cụ dành cho các lập trình viên mà trước đây có mã danh là Atlas giúp xây dựng những ứng dụng web dựa trên tập ngôn ngữ Ajax (Asynchronous JavaScript and XML) – bất đối xứng JavaScript và XML. Ajax chắc hẳn sẽ trở thành một nền tảng cho lựa chọn phát triển kiến trúc các ứng dụng web thế hệ kế tiếp bởi vì công cụ đó cho phép ứng dụng nhanh và mạnh hơn, đồng thời thêm thuận lợi đối với tương tác người sử dụng. Nội dung chương này sẽ giúp sinh viên tìm hiểu được tổng quan về ASP.NET AJAX, đâu là kiến trúc của nó và một số kĩ thuật lập trình cơ bản với ASP.NET AJAX. Kế hoạch giảng Đây là chương có nội dung khá dài, giáo viên nên tách thành 2 phần. Mỗi phần sẽ giảng trong thời gian 3 tiết. Phần 1. Introducing ASP.NET AJAX (part 1 trong giáo trình) Microsoft AJAX Library (part 2 trong giáo trình) Introducing ASP.NET AJAX Phần này giới thiệu cho sinh viên tổng quan về ASP.NET AJAX. Vì trong khoảng thời gian có hạn của chương trình dạy, không thể giảng cho sinh viên từ phần ASP.NET nên trước khi vào nội dung chính giáo viên có thể nên giới thiệu qua về ASP.NET để sinh viên có thể hiểu được nội dung chương này. Các nội dung chính cần truyền đạt cho sinh viên: - What is Ajax? Giới thiệu cho sinh viên khái niệm AJAX. Ajax là một kỹ thuật phát triển web có tính tương tác cao bằng cách kết hợp các ngôn ngữ: HTML (hoặc XHTML) với CSS trong việc hiển thị thông tin; Mô hình DOM (Document Object Model), được thực hiện thông qua JavaScript, nhằm hiển thị thông tin động và tương tác với những thông tin được hiển thị, Đối tượng XMLHttpRequest để trao đổi dữ liệu một cách không đồng bộ với máy chủ web. (Mặc dù, việc trao đổi này có thể được thực hiện với nhiều định dạng như HTML, văn bản thường, JSON và thậm chí EBML, nhưng XML là ngôn ngữ thường .Net Framework 3.5 Page 31
  32. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội được sử dụng); XML thường là định dạng cho dữ liệu truyền, mặc dầu bất cứ định dạng nào cũng có thể dùng, bao gồm HTML định dạng trước, văn bản thuần (plain text), JSON và ngay cả EBML. Giáo viên cần nhấn mạnh cho sinh viên Ajax tự nó không phải là một công nghệ mà là một thuật ngữ mô tả việc sử dụng kết hợp một nhóm nhiều công nghệ với nhau. - Ajax components Trình bày các thành phần của AJAX. Chú ý nhấn mạnh cho sinh viên 4 thành phần chính của AJAX là:  JavaScript  Document Object Model (DOM)  Cascading Style Sheets (CSS)  XMLHttpRequest Giáo viên có thể giải thích qua cho sinh viên khái niệm từng thành phần. Ví dụ nên giải thích cho sinh viên javascript là gì? dùng để làm gì? CSS là gì? - Asynchronous web programming Hướng dẫn sinh viên mô hình tương tác web browser – server trước đây và khi dùng AJAX. Cần nhấn mạnh với sinh viên: Điểm khác biệt cơ bản nhất của công nghệ AJAX là việc xử lý thông tin được thực hiện trên máy client thay vì máy server như cách truyền thống. Máy chủ chỉ làm một việc đơn giản là nhận thông tin từ máy khách và trả các dữ liệu về cho máy khách. Máy khách xử lý sơ bộ thông tin của người dùng nhập vào, sau đó chuyển về máy chủ rồi nhận dữ liệu từ máy chủ và xử lý để hiển thị cho người dùng. - ASP.NET AJAX Architecture Trình bày cho sinh viên kiến trúc của ASP.NET AJAX. Chú ý rằng kiến trúc của ASP.NET AJAX nằm ở cả 2 phía Client và Server.  Client framework  Microsoft Ajax Library  HTML, JavaScript, and XML Script  ASP.NET AJAX service proxies  Server framework  ASP.NET AJAX server controls  Web services bridge  Application services bridge - Development scenarios Giới thiệu 2 kịch bản phát triển ứng dụng:  Client-centric development model  Server-centric development model Phân tích cho sinh viên điểm khác biệt của 2 kịch bản này, trường hợp sử dụng của từng kịch bản. - ASP.NET AJAX goals Giới thiệu cho sinh viên các ưu điểm của việc lập trình ASP.NET AJAX giúp sinh viên tăng thêm hứng thú học tập. .Net Framework 3.5 Page 32
  33. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Microsoft AJAX Library Đây là thành phần chính trong Client Framework. Giáo viên cần giới thiệu với sinh viên các nội dung: - A quick overview of the library Đưa ra cái nhìn tổng quan về library. - Client Library Namespaces: Trình bày tổng quan các namespaces trong library. Chú trọng đến một số namespaces Sys, Sys.Net - Client-Side Event Life Cycle: Trình bày vòng đời của sự kiện phía client, mô tả cho sinh viên từng bước trong vòng đời. Event Handling in the Microsoft AJAX Library: Hướng dẫn sinh viên cách bắt các sự kiện trong Microsoft AJAX Library. Trong phần đầu này giáo viên nên demo cho sinh viên xem một vài ứng dụng nhỏ sử dụng ASP.NET AJAX để tăng tính trực quan và giúp sinh viên nắm bài tốt hơn trong lần đầu tiên tiếp xúc với một kĩ thuật mới. Phần 2. Working with Web Services (part 3 trong giáo trình) ASP.NET AJAX Control Toolkit (part 4 trong giáo trình) Building Web Application (part 5 trong giáo trình) Working with Web Services Gọi Web Services là một phần rất quan trọng trong AJAX. Giáo viên cần giới thiệu cho sinh viên khái niệm Web Services, tầm quan trọng của Web Services hiện nay. Các nội dung cần truyền đạt đến sinh viên bao gồm: - Introduction Giới thiệu với sinh viên về việc làm việc với Web Services qua ASP.NET AJAX. - Server-Side Operations Trình bày các lệnh gọi Web Services bên phía Server. Giáo viên có thể trình bày một ví dụ cụ thể trên Visual Studio hay demo qua video để sinh viên thấy rõ hơn. - Using the ASP.NET Calling Convention - Returning Data ASP.NET AJAX hỗ trợ làm việc với nhiều kiểu dữ liệu, từ các kiểu đơn giản cho đến phức tạp. Giáo viên lấy một vài ví dụ cụ thể để sinh viên nắm được cách làm việc với dữ liệu. - Page-Based Web Services ASP.NET AJAX Control Toolkit Đây là một tập các control mà Microsoft cung cấp để làm việc với Microsoft AJAX Library và AJAX ASP.NET Extensions. Trong đó Microsoft AJAX Library và AJAX ASP.NET Extensions như là core framework còn ASP.NET AJAX Control Toolkit như là một tập các control được xây dựng trên framework đấy. .Net Framework 3.5 Page 33
  34. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Các nội dung chính cần truyền đạt đến sinh viên: - Introduction - Basic Control Usage - Control List: Giới thiệu một số control cơ bản.  Accordion  Calendar  ConfirmButton - Creating Your Own Extender Controls: Giới thiệu cách tạo extender control. Giáo viên có thể trình bày một ví dụ cụ thể cho sinh viên. Building Web Application - Securing Web Applications - Profile Services Phần này trình bày một số vấn đề thường gặp khi xây dựng một ứng dụng Web. Thực hành: Lab 7. Bài tập về nhà: Exercise 7. .Net Framework 3.5 Page 34
  35. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Hướng dẫn thực hành và bài tập Đối với phần bài tập, giáo viên chỉ cần nêu đề bài ứng với mỗi chủ đề trong bài giảng hoặc các phần kiến thức mở rộng yêu cầu sinh viên nghiên cứu thêm. Một phần rất quan trọng trong bài giảng nữa là các video demo. Giáo viên có thể tìm kiếm trên mạng rất nhiều các đoạn video demo. Giáo trình này có đi kèm một số video giúp giáo viên tăng thêm tính trực quan và hấp dẫn của bài giảng. Đây là giáo trình giảng dạy về công nghệ nên việc demo và thực hành là vô cùng quan trọng. Nếu như chỉ nói lý thuyết không thì sinh viên rất khó có thể tiếp thu các vấn đề kỹ thuật, bởi vậy giáo viên có thể không nên đặt nặng vấn đề nói lý thuyết và nên giới thiệu trực quan bằng video hoặc hướng dẫn trên Visual Studio. Sau phần mỗi bài giảng, giáo viên cần hướng dẫn sinh viên phần thực hành. Một số bài thực hành mẫu được đi kèm theo giáo án. Ví dụ đối với phần LINQ, giáo viên có thể cho sinh viên thực hành 3 bài Lab ứng với các phần: LINQ to Object LINQ to SQL LINQ to XML Mỗi bài thực hành phải trình bày cho sinh viên thấy được mục đích của bài thực hành, có thể nhắc lại một số lý thuyết cơ bản và hướng dẫn sinh viên từng bước một. Bài thực hành mẫu với LINQ như sau: Lab 1: LINQ Project: Unified Language Features for Object and Relational Queries (C# language) This lab provides an introduction to The LINQ Project. The language integrated query framework for .NET (codenamed “LINQ”) is a set of language extensions to C# and Visual Basic and a unified programming model that extends the .NET Framework to offer integrated querying for objects, databases and XML. First, you will look at basic LINQ features including the Standard Query Operators and lambda expressions. Next, you will see how these features can be used against in-memory collections, connected databases, and XML documents. Finally, you will take a look at the various query operators available for data manipulation and extraction. Lab Objective Estimated time to complete this lab: 60 minutes The objective of this lab is to gain a clear understanding of the LINQ project. You will see how data manipulation can occur on objects in memory, database tables, and XML files. These new APIs benefit from IntelliSense™ and full compile-time checking without resorting to string-based queries. This lab will touch on basic LINQ technologies, along with database-specific DLinq and XML-specific XLinq. A brief look at query operators will be .Net Framework 3.5 Page 35
  36. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội included. Using LINQ with In-Memory Collections DLinq: LINQ for Connected Databases XLinq: LINQ for XML Documents Understanding the Standard Query Operators Exercise 1 – Using LINQ with In-Memory Collections Note: Realize that The LINQ Project relies on new keywords and syntax introduced with C# 3.0, but which is not yet fully understood by Visual Studio 2005. This may cause some features to give incomplete information or stop functioning entirely; for example IntelliSense™ will not always be correct and error messages can be confusing. Keep in mind that the IDE support and compiler are preview releases, and still have many flaws. A consequence is that incorrect code may result in an abundance of error messages. It is important to address errors top-down, then recompile as spurious errors will often disappear once valid ones are addressed. In this exercise, you will learn how to query over object sequences. Any collection supporting the generic interface System.Collections.Generic.IEnumerable is considered a sequence and can be operated on using the new LINQ Standard Query Operators. Support is also included for types defined using System.Collections.IEnumerable so that existing code will work with LINQ as well. Standard Query Operators allow programmers to construct queries as well as projections that create new types on the fly. This goes hand-in-hand with type inference, a new feature that allows local variables to be automatically typed by their initialization expression. Task 1 – Creating a LINQ Solution 1. Click the Start | Programs | Microsoft Visual Studio 2005 Beta 2 | Microsoft Visual Studio 2005 Beta 2 menu command. 2. Click the Tools | Options menu command 3. In the left hand treeview select Debugger | General 4. In the right hand pane find the option “Redirect all output to the Quick Console window” and uncheck it 5. Click OK 6. Click the File | New | Project menu command 7. In the New Project dialog, in the Project types list on the left, click Visual C# | LINQ Preview 8. In the Templates pane on the right, click LINQ Console Application 9. Click OK. .Net Framework 3.5 Page 36
  37. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội 10. At the warning dialog, click OK Task 2 – Querying a Generic List of Integers 11. In Solution Explorer, double click Program.cs 12. Create a new method that declares a populated collection of integers (put this method in the Program class): static void NumQuery() { var numbers = new int[] { 1, 4, 2, 7, 8, 9 }; } Notice that the left-hand side of the assignment does not explicitly mention a type. This is possible due to one of the new features of LINQ: the inference of type information, where possible, directly by the compiler. In this case the right-hand side specifies that the type is int[]; therefore the type of numbers is inferred to be int[]. This is often convenient for initialization expressions because it allows the type name to be specified only once. 13. Add the following code to query the collection for even numbers: static void NumQuery() { var numbers = new int[] { 1, 4, 2, 7, 8, 9 }; var evenNumbers = from p in numbers where (p % 2) == 0 select p; } In this step the right-hand side of the assignment is a query expression, which is a language extension introduced by The LINQ project. As in the previous step, type inference is being used here to simplify the code. The return type from a query may not be immediately obvious. This example is returning System.Collections.Generic.IEnumerable , but many queries return structured results with no obvious declared type; indeed, sometimes .Net Framework 3.5 Page 37
  38. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội there will be no way to specify the type when they are created as anonymous types. In these cases type inference can be particularly useful. 14. Add the following code to display the results: static void NumQuery() { var numbers = new int[] { 1, 4, 2, 7, 8, 9 }; var evenNumbers = from p in numbers where (p % 2) == 0 select p; Console.WriteLine("Result:"); foreach(var val in evenNumbers) { Console.WriteLine(val); } Console.ReadLine(); } Notice that the foreach statement has been extended to use type inference as well. The final line, Console.ReadLine(), is used to prevent the console window from disappearing until enter is pressed. 15. Finally, add a call to the NumQuery method from the Main method: static void Main(string[] args) { NumQuery(); } 16. Press F5 to launch the application. A console window will appear. As intended all even numbers are displayed (the numbers 4, 2, and 8 appear in the console output). 17. Press ENTER to exit the application. The call to the Console.ReadLine method prevents the console window from disappearing immediately. In subsequent tasks, this step will not be stated explicitly. .Net Framework 3.5 Page 38
  39. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Task 3 – Querying Structured Types 1. In this task, you will move beyond primitive types and apply the query features to custom structured types. Above the Program class declaration, add the following declaration to create a Person class: class Person { public int Age; public string Name; } Notice that there is no declared constructor. In the past this would require consumers to create an instance of the object using the default parameterless constructor and then set the fields explicitly as separate statements. 2. Within the Program class declaration, create the following new method: static void ObjectQuery() { var people = new List () { new Person { Age = 12, Name = "Bob" }, new Person { Age = 18, Name = "Cindy" }, new Person { Age = 13 } }; } There are several interesting things to note about this code block. First of all, notice that the new collection is being populated directly within the curly braces. That is, even though the type is List , not an array, it’s possible to use braces to immediately add elements without calling the Add method. Second, notice that the Person elements are being created with a new syntax (known as object initializers). Even though there is no constructor with two parameters for the Person class, it is possible to create objects of that class as expressions by setting its fields explicitly inside curly braces. Finally, notice that there is no need to specify every field explicitly, rather only those which need to be set are stated. For example, the third element only sets the Age field of the Person. The Name property will retain its default value of null. 3. Next query the collection for teenagers. Add the following query code: .Net Framework 3.5 Page 39
  40. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội static void ObjectQuery() { var people = new List () { new Person { Age = 12, Name = "Bob" }, new Person { Age = 18, Name = "Cindy" }, new Person { Age = 13 } }; var teenagers = from p in people where p.Age > 12 && p.Age () { new Person { Age=12, Name="Bob" }, new Person { Age=18, Name="Cindy" }, new Person { Age=13 } }; var teenagers = from p in people where p.Age > 12 && p.Age Name = {0}, Age = {1}", val.Name, val.Age); } Console.ReadLine(); } As before, the var keyword is used in the foreach loop yet it is still strongly typed. 5. Add a call to the ObjectQuery method in the Main method (and remove the call to NumQuery): static void Main(string[] args) .Net Framework 3.5 Page 40
  41. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội { ObjectQuery(); } 6. Press F5 to debug the application. Two results are shown. The first result shows that the name is Cindy, but the second result shows no name. This is the expected output since the Name field of that object was never initialized. As you can see, working with complex types is just as easy as working with primitive types using LINQ query expressions. Exercise 2 – DLinq: LINQ for Connected Databases Note: This exercise demonstrates that the same features available for querying in-memory collections can be applied to databases. In this exercise, you will learn about DLinq, a new part of ADO.NET that supports Language Integrated Query, allowing you to query and manipulate objects associated with database tables. It eliminates the traditional mismatch between database tables and your application’s domain specific object model freeing you to work with data as objects while the framework manages the rest. Task 1 – Working with DLinq 7. The first step is to create business objects to model the tables. Right click the LINQConsoleApplication1 project and then click Add | Existing Item. To simplify the lab, the Northwind table definitions will be imported from an external file. The code is easy to understand, but tedious and error-prone to generate. Once the definitions are in-place accessing the tables is easy. The LINQ Preview contains a program (SQLMetal) that can be used to generate these classes automatically. 8. Browse to C:\Program Files\LINQ Preview\Samples\SampleQueries\Northwind.cs 9. Click Add 10. In Program.cs, add a directive to use the nwind namespace at the top of the file: using nwind; 11. In Solution Explorer, double click LINQConsoleApplication1 | Northwind.cs .Net Framework 3.5 Page 41
  42. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Notice that the Northwind object inherits from DataContext. This is not necessary for in-memory LINQ queries but, in the case of DLinq, it adds additional support for accessing the underlying database tables. 12. Scroll down to the public partial class Category Each type definition relates to a given database table. Each column is defined with a database datatype, primary/foreign key relationships, identity status and other relevant properties for declaratively creating an object model from a database table. This allows data to be retrieved and manipulated consistently from the underlying table, while allowing client code to treat it strictly as objects. Task 2 – Querying using Expressions 13. In Program.cs, within the Program class declaration, create the following new method: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); } This creates a Northwind object that represents the strongly typed connection to the database. 14. Each table is now accessed as a property of the db variable. At this point, querying is identical to the previous exercise. Add the following code to retrieve American customers: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var matchingCustomers = from c in db.Customers where c.Country == "USA" select c; } 15. Displaying the matching customers is straightforward. Add the following code: .Net Framework 3.5 Page 42
  43. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var matchingCustomers = from c in db.Customers where c.Country == "USA" select c; foreach(var cust in matchingCustomers) { Console.WriteLine("> {0} / {1} / {2}", cust.CompanyName, cust.ContactName, cust.Country); } Console.ReadLine(); } Of course, at this point the collection of matching customers could just as easily be displayed in a list box or printed in a report. 16. Finally, add a call to the new method in the Main method (and remove the call to ObjectQuery): static void Main(string[] args) { DatabaseQuery(); } 17. Press F5 to debug the application. Thirteen results are shown. These are all of the customers in the Northwind Customers table with a Country value of USA. 18. So far, the queries have been primarily based on filtering; however, LINQ supports many options to query data beyond filtering. For example, to sort the list by ContactName simply use the orderby clause: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var matchingCustomers = .Net Framework 3.5 Page 43
  44. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội from c in db.Customers where c.Country == "USA" orderby c.ContactName select c; foreach(var cust in matchingCustomers) { Console.WriteLine("> {0} / {1} / {2}", cust.CompanyName, cust.ContactName, cust.Country); } Console.ReadLine(); } 19. Press F5 to debug the application. The same thirteen results are shown, but notice that the order is now determined by the alphabetical ordering second displayed field, ContactName. 20. It is also possible to use built-in string methods in queries. Modify the where clause as shown: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var matchingCustomers = from c in db.Customers where c.CompanyName.Contains("Market") orderby c.ContactName select c; foreach( var cust in matchingCustomers) { Console.WriteLine("> {0} / {1} / {2}", cust.CompanyName, cust.ContactName, cust.Country); } Console.ReadLine(); } 21. Press F5 to debug the application. .Net Framework 3.5 Page 44
  45. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội The results have been filtered down to just the four rows containing "Market" in the CompanyName column. Task 3 – Querying using the Standard Query Operators 22. The query expression syntax shown in previous examples (expressions starting with “from”) is not the only method of querying data using LINQ. LINQ also introduces various Standard Query Operators to achieve the same functionality using a more traditional object-centric approach. Modify the code to use explicit query construction: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var matchingCustomers = db.Customers. Where(c => c.CompanyName.Contains("Market")); foreach(var cust in matchingCustomers) { Console.WriteLine("> {0} / {1} / {2}", cust.CompanyName, cust.ContactName, cust.Country); } Console.ReadLine(); } The parameter passed to the Where method is known as a lambda expression and the syntax for creating it is introduced with C# 3.0. The "c" becomes the parameter to an unnamed method. The => token separates the parameter assignment from the actual body. The c.CompanyName.Contains("Market") expression can be thought to have an implicit return statement preceding it. In DLinq this expression is emitted as an expression tree which DLinq uses to construct the equivalent SQL statement at runtime. 23. Press F5 to debug the application. .Net Framework 3.5 Page 45
  46. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Notice that little has changed in this example. The query is now calling the Standard Query Operators, but the results are the same, as is the procedure for working with the results. 24. Aggregates of data can be produced by simply calling the Standard Query Operators on the result just as you would any other method. Add the following code to determine the average unit price of all products starting with the letter "A": static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var matchingCustomers = db.Customers.Where(c => c.CompanyName.Contains("Market")); foreach( var cust in matchingCustomers) { Console.WriteLine("> {0} / {1} / {2}", cust.CompanyName, cust.ContactName, cust.Country); } var avgCost = db.Products. Where(p => p.ProductName.StartsWith("A")). Select(p => p.UnitPrice). Average(); Console.WriteLine("Average cost = {0:c}", avgCost); Console.ReadLine(); } 25. Press F5 to debug the application. In addition to the customers the results now show the average cost for products starting with "A". If this is read from left to right, it would read as, specify the table (db.Products) and restrict the results to those with product names which begin with "A". This first step, by itself, simply returns a filtered result set of Products matching the criteria. Next, select the UnitPrice column which returns a collection of prices, one for each original result. The final .Net Framework 3.5 Page 46
  47. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội method performs an average on the collection of prices and returns a single value. Exercise 3 – XLinq: LINQ for XML documents Note: XLinq is an in-memory XML cache that takes advantage of Standard Query Operators and exposes a simplified way to create XML documents and fragments. In this exercise, you will learn how to read XML documents into the XDocument object, how to query elements from that object, and how to create documents and elements from scratch. Task 1 – Adding XLinq Support 26. The project template used earlier takes care of adding references and using directives automatically. In Solution Explorer, expand LINQConsoleApplication1 | References Notice the System.Xml.XLinq reference. 27. In Program.cs notice the directive to use the XLinq namespace: using System.Xml.XLinq; Task 2 – Creating Documents from Scratch 28. Creating full-fledged documents from scratch requires instantiating the XDocument object then appropriate XElement, XAttribute and other entities as required for the document. If only an XML fragment is needed then just the XElement class can be used. After the Main method, enter the following code to create a small document containing contact names: public static XDocument CreateDocument() { // create the document all at once return new XDocument( new XDeclaration("1.0", null, null), new XElement("organizer", new XElement("contacts", new XE lement("contact", new XAttribute("category", "home"), new XE lement("name", "John Smith")), new XE lement("contact", new XAttribute("category", "home"), new XE lement("name", "Sally Peters")), new XE lement("contact", new XAttribute("category", "work"), new XE lement("name", "Jim Anderson"))))); } .Net Framework 3.5 Page 47
  48. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội 29. The simplest action to take is to display the document. After the CreateDocument method, create a new method, XMLQuery, invoke CreateDocument, then write the document to the console as follows: public static void XMLQuery() { XDocument doc = CreateDocument(); Console.WriteLine(doc); Console.ReadLine(); } 30. Replace the code in the Main method with a call to XMLQuery(): static void Main(string[] args) { XMLQuery(); } 31. Press F5 to debug the application. As you can see, creating the document required few steps, and can be accomplished in a single line of code 32. The next step is to query the document. The Descendants method returns all descendant elements of the name typed (in this case, contact). The Where method should be familiar from previous exercises. Add the following code to query for all contact elements with a category attribute matching "home": public static void XMLQuery() { XDocument doc = CreateDocument(); Console.WriteLine(doc); var contacts = from c in doc.Descendants("contact") where (string)c.Attribute("category") == "home" select c; Console.WriteLine("\n\nResults:"); foreach(var contact in contacts) { Console.WriteLine("\n{0}", contact); .Net Framework 3.5 Page 48
  49. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội } Console.ReadLine(); } 33. Press F5 to debug the application. In addition to the document being displayed, you now also have an XML element containing only the two non-work contacts. This is a departure from DOM programming that requires that all elements be part of a document. This XML element can be considered "document-free." 34. XLinq also makes it easy to create new elements from existing elements. This can be substantially easier than working with XQuey/XPath due to the available C# language constructs with which you are familiar. Enter the following code to transform the contacts XML into a list of friends. public static void XMLQuery() { XDocument doc = CreateDocument(); Console.WriteLine(doc); var contacts = from c in doc.Descendants("contact") where (string)c.Attribute("category") == "home" select c; Console.WriteLine("\n\nResults:"); foreach(var contact in contacts) { Console.WriteLine("\n{0}", contact); } XElement transformedElement = new XElement("friends", from f in contacts select new XElement("friend", new XAttribute("fullname", (string)f.Element("name")))); Console.WriteLine("\n\n {0}", transformedElement); Console.ReadLine(); .Net Framework 3.5 Page 49
  50. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội } 35. Press F5 to debug the application. At first glance the code may appear convoluted, but breaking it down it should appear logical. A new XElement object, friends, is created. The second argument simply returns a collection of XElement objects to be placed beneath the friends element. The collection is the same query used to return all personal contact elements from a few steps ago. Then, instead of simply selecting an item to return, a new XElement object, friend, is created with an XAttribute of fullname. Task 3 – Using XML Documents with Files 36. Documents or elements can easily be saved to and restored from files. public static void XMLQuery() { XDocument doc = CreateDocument(); Console.WriteLine(doc); var contacts = from c in doc.Descendants("contact") where (string)c.Attribute("category") == "home" select c; Console.WriteLine("\n\nResults:"); foreach(var contact in contacts) { Console.WriteLine("> {0}", contact); } XElement transformedElement = new XElement("friends", from f in contacts select new XElement("friend", new XAttribute("fullname", (string)f.Element("name")))); Console.WriteLine("\n\n {0}", transformedElement); transformedElement.Save("XLinqDocument.xml"); .Net Framework 3.5 Page 50
  51. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội XDocument doc2 = XDocument.Load("XLinqDocument.xml"); Console.WriteLine("\n\nFrom disk:\n{0}", doc2); Console.ReadLine(); } 37. Press F5 to debug the application. Little has changed in the output, except that transformed document is now displayed twice. The second display is from the saved file. Saving and loading documents requires little effort. Exercise 4 – Understanding the Standard Query Operators Note: LINQ contains approximately thirty different query operators. Only a small sample of them will be highlighted here, and additional operators can be added programmatically. In this exercise, you will learn about several of the query operators available for data access and manipulation. These operators are declared as extension methods on the System.Query.Sequence type and are known together as the Standard Query Operators. These operators operate on sequences, that is, any object that implements IEnumerable . Task 1 – Working with the OfType Operator 38. LINQ retains all type information through queries and modifications. The OfType operator can be used alone to restrict a result set, or in conjunction with other operators. Above the CreateDocument method, add the following new method: public static void OperatorQuery() { object[] values = {1, "ant", 2, 'x', 3, true, 4}; } An unlikely collection such as this would be difficult to query. Having numeric, string, character, and Boolean values make any common comparison impossible. 39. The OfType operator restricts a result set to only those values of the given type, regardless of any other criteria. Add the following code to see a simple restriction query in this format: .Net Framework 3.5 Page 51
  52. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội public static void OperatorQuery() { object[] values = {1, "ant", 2, 'x', 3, true, 4}; var results = values.OfType (); } 40. Now that the results are restricted, the values can be used or simply displayed. Add the following code to dump the integer results to the console: public static void OperatorQuery() { object[] values = {1, "ant", 2, 'x', 3, true, 4}; var results = values.OfType (); Console.WriteLine("Results:"); foreach( var result in results ) { Console.WriteLine(result); } Console.ReadLine(); } 41. Add a call to the new method in the Main method: static void Main(string[] args) { OperatorQuery(); } 42. Press F5 to debug the application. Only the int values are displayed. From here, the results can be further restricted or manipulated as needed. Task 2 – Working with the Min, Max, Sum, and Average Operators 43. In the previous exercise, you worked with Northwind database tables to learn how DLinq can work with databases. You will now return to the DatabaseQuery method to use some additional operators on the data. Add a call to the method in the Main method: .Net Framework 3.5 Page 52
  53. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội static void Main(string[] args) { DatabaseQuery(); } 44. In the DatabaseQuery method, delete most of the body so that it appears thus: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); Console.ReadLine(); } 45. Add the following lines to demonstrate the Min, Max, Sum, and Average operators: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var minCost = db.Products.Min(p => p.UnitPrice); var maxCost = db.Products.Select(p => p.UnitPrice).Max(); var sumCost = db.Products.Sum(p => p.UnitsOnOrder); var avgCost = db.Products.Select(p => p.UnitPrice).Average(); Console.WriteLine("Min = {0:c}, Max = {1:c}, Sum = {2}, Avg = {3:c}", minCost, maxCost, sumCost, avgCost); Console.ReadLine(); } This example demonstrates how the various aggregate math functions can be applied to data. You may have noticed that there are two signatures for the methods shown. Min and Sum are invoked directly on the db.Products object, while the Max and Average operators are chained after Select operators. The effect is identical. In the former case the aggregate function is applied just to the sequences that satisfy the expression, in the latter case it is applied to all the objects. .Net Framework 3.5 Page 53
  54. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội 46. Press F5 to debug the application. The addition of these operators reduces code complexity considerably. Task 3 – Working with the Select Operator 47. The Select operator is used to perform a projection over a sequence, based on the arguments passed to the operator. The source data is enumerated and results are yielded based on the selector function for each element. The resulting collection can be a direct pass-through of the source objects, a single-field narrowing, or any combination of fields in a new object. In the DatabaseQuery method, delete most of the body so that it appears thus: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); Console.ReadLine(); } 48. Add the following lines to create a direct projection: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var productsWithCh = from p in db.Products where p.ProductName.Contains("Ch") select p; Console.ReadLine(); } As written, this query will first restrict the source data based on ProductName, then select the entire Product. 49. Add the following lines to create a single-value projection: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var productsWithCh = .Net Framework 3.5 Page 54
  55. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội from p in db.Products where p.ProductName.Contains("Ch") select p; var productsByName = db.Products. Where(p => p.UnitPrice p.ProductName ); Console.ReadLine(); } This query restricts based on the unit price, then returns a sequence of product names. 50. Add the following lines to create a multi-value projection by using an anonymous type: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var productsWithCh = from p in db.Products where p.ProductName.Contains("Ch") select p; var productsByName = db.Products. Where(p => p.UnitPrice p.ProductName ); var productsDetails = db.Products. Where(p => p.Discontinued). Select(p => new {p.ProductName, p.UnitPrice}); Console.ReadLine(); } The returned type in this example is never declared as a type. It is created by the compiler based on the data types specified. 51. Finally, display the results with the following code: .Net Framework 3.5 Page 55
  56. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var productsWithCh = from p in db.Products where p.ProductName.Contains("Ch") select p; var productsByName = db.Products. Where(p => p.UnitPrice p.ProductName ); var productsDetails = db.Products. Where(p => p.Discontinued). Select(p => new {p.ProductName, p.UnitPrice }); Console.WriteLine(">>Products containing Ch"); foreach(var product in productsWithCh) { Console.WriteLine("{0}, {1}", product.ProductName, product.ProductID); } Console.WriteLine("\n\n>>Products names only"); foreach(var product in productsByName) Console.WriteLine(product); Console.WriteLine("\n\n>>Products as new types"); foreach(var product in productsDetails) { Console.WriteLine("{0}, {1}", product.ProductName, product.UnitPrice); } Console.ReadLine(); } 52. Press F5 to debug the application and view the results .Net Framework 3.5 Page 56
  57. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Task 4 – Working with the Where Operator 53. The Where operator filters a sequence of values based on a predicate. It enumerates the source sequence yielding only those values that match the predicate. In the DatabaseQuery method, delete most of the body so that it appears thus: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); Console.ReadLine(); } 54. The Where operator can filter based on any predicate. Enter the following code to filter the employee based on birthdate: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var janBirthdays = db.Employees. Where(e => e.BirthDate.Value.Month == 1); foreach(var emp in janBirthdays) { Console.WriteLine("{0}, {1}", emp.LastName, emp.FirstName); } Console.ReadLine(); } 55. Press F5 to debug the application and view the results Task 5 – Working with the Count Operator 56. The Count operator simply returns the number of elements in a sequence. This can be applied to the collection itself, or chained to other operators such as Where to count a restricted sequence. In the DatabaseQuery method, delete most of the body so that it appears thus: static void DatabaseQuery() { Northwind db = new Northwind( .Net Framework 3.5 Page 57
  58. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); Console.ReadLine(); } 57. Add the following code to count the number of elements in the Customers table: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); int before = db.Customers.Count(); int after = db.Customers.Where(c => c.City == "London").Count(); int after2 = db.Customers.Count(c => c.City == "London"); Console.WriteLine("Before={0}, After={1}/{2}", before, after, after2); Console.ReadLine(); } Notice that the restriction can occur prior to Count being invoked. It can also take effect directly within the call to Count. 58. Press F5 to debug the application and view the results Task 6 – Working with the All and Any Operators 59. The All and Any operators check whether any or all elements of a sequence satisfy a condition. The Any operator returns as soon as a single matching element is found. In the DatabaseQuery method, delete most of the body so that it appears thus: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); Console.ReadLine(); } 60. Like the Count operator, the All and Any operators can be invoked on any condition, and can further restrict their scope by passing a predicate directly in the invocation. Add the following code to demonstrate both operators: .Net Framework 3.5 Page 58
  59. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var cust1 = db.Customers.Where(c => c.Orders.Any()); var cust2 = db.Customers. Where(c => c.Orders.All(o => o.Freight < 50)); foreach( var cust in cust1 ) Console.WriteLine("{0}", cust.ContactName); Console.WriteLine(" "); foreach( var cust in cust2 ) Console.WriteLine("{0}", cust.ContactName); Console.ReadLine(); } In this case, the Any operator is used within the Where operator of another expression. This is perfectly legal as the operator is still being called on a sequence, c.Orders. This is used to return a sequence of all customers who have placed any orders. The All operator is used to return customers whose orders have all had freight costs under $50. 61. Press F5 to debug the application and view the results Task 7 – Working with the ToArray and ToList Operators 62. The ToArray and ToList operators are convenience operators designed to convert a sequence to a typed array or list, respectively. In the DatabaseQuery method, delete most of the body so that it appears thus: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); Console.ReadLine(); } .Net Framework 3.5 Page 59
  60. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội 63. These operators are very useful for integrating queried data with existing libraries of code. They are also useful when you want to cache the result of a query. Start by creating a sequence: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var customers = db.Customers.Where(c => c.City == "London"); Console.ReadLine(); } Note that the sequence could even be as simple as db.Customers. Restricting the results is not a necessary component to use ToArray or ToList. 64. Next, simply declare an array or List collection, and assign the proper values using the appropriate operator: static void DatabaseQuery() { Northwind db = new Northwind( @"C:\Program Files\LINQ Preview\Data\Northwnd.mdf"); var customers = db.Customers.Where(c => c.City == "London"); Customer[] custArray = customers.ToArray(); List custList = customers.ToList(); Console.ReadLine(); } .Net Framework 3.5 Page 60
  61. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Lab Summary In this lab you performed the following exercises. Using LINQ with In-Memory Collections DLinq: LINQ for Connected Databases XLinq: LINQ for XML Documents Understanding the Standard Query Operators You saw how the LINQ framework and features seamlessly tie together data access and manipulation from a variety of sources. LINQ allows you to work with in-memory objects with the power of SQL and the flexibility of C#. DLinq further builds on this support to link your objects to database tables with little extra effort. Finally XLinq brings XML query abilities with the features of XPath, but the ease of C#. The large collection of standard query operators offers built-in options for data manipulation that would have required extensive custom code in the past. Using the LINQ additions to C#, querying and transforming data in a variety of formats is easier than ever. .Net Framework 3.5 Page 61
  62. .Net framework 3.5 Trường Đại Học Bách Khoa Hà Nội Kết luận Công nghệ .NET của Microsoft là một công nghệ mạnh mẽ và liên tục được phát triển. .NET framework là cái lõi nền tảng để làm việc với .NET nên đây là một nội dung rất quan trọng, cần được giới thiệu rộng rãi với sinh viên công nghệ thông tin và các ngành khác có liên quan. Giáo trình .NET framework 3.5 chỉ được soạn cho thời gian 45 tiết trong khi các nội dung trong đó có thể tách thành các khóa học riêng biệt, ví dụ như LINQ hay WPF, WCF Chính bởi vậy giáo trình không thể đi hết các nội dung quan trọng của .NET framework mà chỉ mang tính chất giới thiệu cho sinh viên một số kĩ năng cơ bản ứng với một số công nghệ nổi bật của .NET framework 3.5. Nếu có điều kiện, giáo viên nên tách một số phần quan trọng trong .NET framework 3.5 thành các giáo trình riêng như LINQ, WPF, WCF, ASP.NET AJAX hay đưa thêm vào một số công nghệ khác như WF, CardSpace Vì thời gian thực hiện bộ giáo trình còn hạn chế và đây chỉ là version đầu tiên nên trong giáo trình vẫn còn nhiều thiếu sót. Trong thời gian tới chúng tôi sẽ cố gắng hoàn thiện giáo trình hơn nữa. Rất mong nhận được các ý kiến đóng góp của tất cả mọi người. .Net Framework 3.5 Page 62