Thứ Năm, 28 tháng 2, 2008

Cấu hình Log4net như thế nào (Phần 1)?

Bài viết này trình bày các cấu hình ví dụ cho việc xây dựng trong appenders. Các cấu hình được thiết kế để làm việc với các log4net.Config.DOMConfigurator và log4net.Repository.Hierarchy.Hierarchy này.

Những ví dụ này không có nghĩa là cấu hình đầy đủ cho các appenders. Đối với một danh sách đầy đủ các thông số có thể thể chỉ định cho từng appender và chi tiết hơn trên mỗi tùy chọn xem tài liệu SDK cho appender này.

AdoNetAppender :

Để biết chi tiết đầy đủ xem tham khảo SDK mục: log4net.Appender.AdoNetAppender.

Những cấu hình của AdoNetAppender phụ thuộc vào nhà cung cấp lựa chọn cho các cơ sở dữ liệu mục tiêu. Dưới đây là một số ví dụ.

MS SQL Server :
Ví dụ sau đây cho thấy làm thế nào với cấu hình các AdoNetAppender để log tin nhắn với một cơ sở dữ liệu SQL Server. Những sự kiện được viết bằng lô 100 (BufferSize). ConnectionType quy định cụ thể tên kiểu đủ điều kiện cho các System.Data.IDbConnection sử dụng để kết nối với cơ sở dữ liệu. ConnectionString là cơ sở dữ liệu nhà cung cấp cụ thể. CommandText là cả một tuyên bố đã chế biến hoặc thủ tục lưu trữ, trong trường hợp này nó có một prepared statement. Mỗi tham số lập báo cáo hoặc thủ tục lưu trữ được chỉ định bằng tên nó, kiểu cơ sở dữ liệu và cách bố trí mà renders giá trị cho tham số.

Định nghĩa bảng cơ sở dữ liệu có:

CREATE TABLE [dbo].[Log] (
     [Id] [int] IDENTITY (1, 1) NOT NULL,
     [Date] [datetime] NOT NULL,
     [Thread] [varchar] (255) NOT NULL,
     [Level] [varchar] (50) NOT NULL,
     [Logger] [varchar] (255) NOT NULL,
     [Message] [varchar] (4000) NOT NULL,
     [Exception] [varchar] (2000) NULL
)

Những cấu hình appender có:

  
      
      
      
      
         
         
         
      
      
         
         
         
         
             
         
     
     
         
         
         
         
                
          
      
      
             
             
             
             
                   
             
      
      
             
             
             
             
                  
             
       
       
              
              
              
              
        

DangTrung,

Làm Thế Nào Config Log4Net Trong C#

Log4net là gì?

Log4net là một công cụ giúp người lập trình ghi lại những thông tin trong lúc chạy ứng dụng. Nó chính là một phiên bản chuyển thể từ log4j và vẫn tiếp tục được phát triển kể từ năm 2001. Trong trường hợp ứng dụng của bạn có lỗi mà vẫn không tìm được nguyên nhân, log4net có thể là vị cứu tinh để giúp bạn xác định nơi gây lỗi. Ngoài ra, Log4net còn có thể thay đổi trạng thái log lúc chương trình chạy mà không cần ngừng chương trình. Bên cạnh đó, khi sử dụng log4net sẽ không ảnh hưởng đáng kể đến performance của ứng dụng, log4net còn được thiết kế với tính flexibility rất cao, chúng ta có thể mở rộng và thêm thắt những thứ mình muốn vào thư viện log4net, chẳng hạn như cách thức log, định dạng log,

Sử dụng như thế nào?

Trong bài viết này, tôi sẽ giới thiệu cách sử dụng log4net cho một window application và cách config cho log4net ghi thông tin log ra file bằng một file config. Thực ra đối với web application thì cách sử dụng hoàn toàn tương tự. Chỉ có một số trường hợp file log của bạn không sinh ra được vì không đủ quyền. Như các bạn biết thì Web application chạy dưới 1 process bằng quyền của user ASPNET trong Windows, dó đó nếu user này không đủ quyền ghi file vào folder web của bạn thì file log tương ứng cũng có thể không được tạo ra.

Hãy download version mới nhất của log4net từ website apache. và add reference vào project của bạn như hình sau :

Sau khi bạn đã reference Log4net vào project của mình hoàn chỉnh, các bước còn lại bạn tiếp tục config để project của bạn hiểu Log4Net ở đâu. Để project hiểu bạn cần config code mỗi khi project gọi Log4Net, như vậy thì rất dài dòng và phức tạp vì phải gọi đi gọi lại nhiều lần. Cách đơn giản hãy tạo một class dùng chung và bạn có thể gọi bất cứ đâu mà bạn muốn :

public static class LogService
{
      #region Members
      private static readonly ILog logger = LogManager.GetLogger(typeof(LogService));
     #endregion

      #region Constructors
      static LogService()
     {
          BasicConfigurator.Configure();
          XmlConfigurator.Configure();
     }
     #endregion

     #region Methods

     ///
     ///
     ///
     ///
    ///
    ///
    public static void WriteLog(LogLevel logLevel, String log)
    {
         if (logLevel.Equals(LogLevel.DEBUG))
             logger.Debug(log);
        else if (logLevel.Equals(LogLevel.ERROR))
            logger.Error(log);
        else if (logLevel.Equals(LogLevel.FATAL))
            logger.Fatal(log);
        else if (logLevel.Equals(LogLevel.INFO))
            logger.Info(log);
        else if (logLevel.Equals(LogLevel.WARN))
            logger.Warn(log);
    }
    #endregion
}

Bây giờ chúng ta đã có class dùng chung trong project của bạn, câu hỏi ở đây là chúng ta sẽ gọi chúng như thế nào? và còn config nào nữa ?. Câu trả lời cho các bạn là còn rất nhiều bạn cứ từ từ và xem tiếp theo. Trước tiên bạn xem project của bạn thuộc một thể loại nào Application hay Web, không sao dù là project nào thì đều có file config riêng cho nó.
  • Application thì ta có App.config
  • Web thì ta có Web.config.
Bạn hãy thêm config này vào trong config file của bạn :


Trong file cấu hình này, tôi sử dụng RollingFileAppender. Có rất nhiều loại Appender được xây dựng sẵn trong thư viện log4net. Mỗi loại sẽ có công dụng ghi nội dung log vào một nơi khác nhau. Trong đó RollingFileAppender là được sử dụng nhiều nhất và cũng dễ sử dụng nhất. Tôi sẽ giải thích những gì tôi nghĩ là khó hiểu nhất


Thông tin log của chúng ta sẽ được ghi vào file Log4netSampleLog.txt, file này sẽ nằm ở thư mục chạy của ứng dụng, cùng cấp với file exe và file .config của chúng ta. Nếu muốn nó lưu file vào chỗ khác chúng ta có thể hardcode đường dẫn ở đây.


Dữ liệu log sẽ được ghi vào file, vì ta đang sử dụng là RollingFileAppender, nên khi kích thước file vượt quá một mức nào đó thì nó sẽ đổi tên file cũ và ghi vào file mới. Tổng số lượng file tối đa sẽ là 10 và những file cũ nhất sẽ bị xóa nếu số lượng file vượt quá 3.


Kích thước file log tối đa sẽ là 1MB.

Layout:

Đây là phần khá thú vị, những text log mà chúng ta ghi ra sẽ kèm thêm một số thông tin theo như phần định dạng trong layout như ngày tháng, threadId, className, ... Các bạn có thể tùy biến phần layout này để được log output dễ nhìn nhất.


Level:

Level mặc định sẽ là Debug cho mọi nơi có sử dụng log trong chương trình của bạn. Nghĩa là nếu bạn khai báo như hình, thì mọi chỗ bạn log đều được ghi xuống file vì level DEBUG là level thấp nhất, nhưng nếu chỗ này bạn để là ERROR thì chỉ có những log với level cao hơn hoặc bằng ERROR mới được ghi xuống file. Khi deploy chương trình cho khách hàng, thường thì chúng ta sẽ để level default là ERROR, khi sử dụng có lỗi ta sẽ yêu cầu khách hàng sử lại thành DEBUG nếu cần thiết.


- Thông thường người ta sử dụng full name của class (kèm theo đầy đủ namespace) để dùng như loggerName. Cách dùng này rất hợp lý vì chúng ta sẽ biết đoạn log của mình sinh ra từ class.nào. Để ghi Log bạn cần phải xác định rằng bạn ghi cái gì và ghi như thế nào?

Để ghi thông tin bạn làm như sau :

Để ghi lỗi bạn làm như sau :


Còn nhiều và nhiều cách config cho Log4Net bạn có thể tham khao các cách config tại trang wen của nó.

Chúc bạn thành công.
Dang Trung.

Thứ Tư, 27 tháng 2, 2008

Tìm hiểu về log4net



log4net là một công cụ để giúp đỡ các lập trình ghi lại báo cáo và xuất ra một loạt các mục tiêu. Khi có vấn đề với các ứng dụng, nó thật sự hữu ích có thể tìm ra vấn đế một cách chính xác. Với log4net có thể để cho phép đăng nhập tại thời gian chạy mà không sửa đổi các ứng dụng hệ nhị phân. Những gói log4net được thiết kế để báo cáo bản ghi có thể vẫn còn trong mã shipped mà không bị một chi phí hoạt động cao.

Một trong những tính năng đặc biệt trong log4net là khái niệm trong phân cấp logger. Sử dụng những logger có thể kiểm soát trong đó báo cáo có chọn lọc log file xuất theo tùy ý.

log4net được thiết kế với hai mục tiêu riêng biệt ghi nhớ: tốc độ và tính linh hoạt

Tính Năng :
  • Hỗ trợ cho nhiều framework
  • Đầu ra cho nhiều mục tiêu ghi
  • Phân cấp kiến trúc ghi
  • Cấu hình XML
  • Dynamic Configuration
  • Bối cảnh Logging
  • Cung cấp khả năng kiến trúc
  • Modular và thiết kế mở rộng
  • Hiệu suất cao với sự linh hoạt

Hỗ trợ cho nhiều framework :
log4net chạy trên tất cả tương thích runtimes CLI ECMA 1,0. log4net có cụ thể bản xây dựng cho các framework sau đây:
  • Microsoft .NET Framework 1.0 (1.0.3705)
  • Microsoft .NET Framework 1.1 (1.1.4322)
  • Microsoft .NET Framework 2.0 (2.0.50727)
  • Microsoft .NET Compact Framework 1.0
  • Mono 1.0
  • Mono 2.0
  • Microsoft Shared Source CLI 1.0
  • CLI 1.0 Compatible

Lưu ý:. Do sự hỗ trợ framework NET cho log4net tương thích ngược sẽ chạy trên phiên bản tương lai của runtimes được liệt kê ở trên.

Đầu ra cho nhiều mục tiêu ghi :
  • log4net.Appender.AdoNetAppender : ghi sự kiện vào cơ sở dữ liệu bằng cách sử dụng prepared statements hoặc stored procedures.
  • log4net.Appender.AnsiColorTerminalAppender : Writes color highlighted logging events to a an ANSI terminal window.
  • log4net.Appender.AspNetTraceAppender Writes logging events to the ASP trace context. These can then be rendered at the end of the ASP page or on the ASP trace page.
  • log4net.Appender.ColoredConsoleAppender Writes color highlighted logging events to the application's Windows Console.
  • log4net.Appender.ConsoleAppender Writes logging events to the application's Console. The events may go to either the standard our stream or the standard error stream.
  • log4net.Appender.EventLogAppender Writes logging events to the Windows Event Log.
  • log4net.Appender.FileAppender Writes logging events to a file in the file system.
  • log4net.Appender.LocalSyslogAppender Writes logging events to the local syslog service (UNIX only).
  • log4net.Appender.MemoryAppender Stores logging events in an in memory buffer.
  • log4net.Appender.NetSendAppender Writes logging events to the Windows Messenger service. These messages are displayed in a dialog on a users terminal.
  • log4net.Appender.OutputDebugStringAppender Writes logging events to the debugger. If the application has no debugger, the system debugger displays the string. If the application has no debugger and the system debugger is not active, the message is ignored.
  • log4net.Appender.RemoteSyslogAppender Writes logging events to a remote syslog service using UDP networking.
  • log4net.Appender.RemotingAppender Writes logging events to a remoting sink using .NET remoting.
  • log4net.Appender.RollingFileAppender Writes logging events to a file in the file system. The RollingFileAppender can be configured to log to multiple files based upon date or file size constraints.
  • log4net.Appender.SmtpAppender Sends logging events to an email address.
  • log4net.Appender.TelnetAppender Clients connect via Telnet to receive logging events.
  • log4net.Appender.TraceAppender Writes logging events to the .NET trace system.
  • log4net.Appender.UdpAppender Sends logging events as connectionless UDP datagrams to a remote host or a multicast group using a UdpClient.

phân cấp kiến trúc ghi :
phân cấp ghi là một phù hợp lý tưởng với phát triển dựa trên các thành phần. Mỗi thành phần có trong logger riêng của mình. Khi cá nhân được thử nghiệm, các tính chất trong các logger có thể thiết lập như là phát triển các yêu cầu. Khi kết hợp với các thành phần khác, các logger kế thừa các thuộc tính xác định bởi integrator trong các thành phần. Một lựa chọn có thể nâng cao các ưu tiên ghi vào một thành phần mà không ảnh hưởng đến các thành phần khác. Điều này rất hữu ích khi bạn cần một chi tiết theo dõi từ một thành phần chỉ duy nhất mà không lấn át các theo dõi tập tin với những thông điệp từ các thành phần khác. Tất cả điều này có thể thể thực hiện qua các các file cấu hình, không thay đổi mã là cần thiết.

Cấu hình XML :
log4net có cấu hình bằng cách sử dụng một tập tin cấu hình XML. Những thông tin cấu hình có thể thể nhúng vào trong file cấu hình XML khác (chẳng hạn như tập tin cấu hình của ứng dụng.) hoặc trong một file riêng biệt. Các cấu hình là dễ đọc và dễ updateable trong khi giữ lại sự linh hoạt để thể hiện tất cả các cấu hình. Ngoài ra log4net có thể được cấu hình lập trình.

Dynamic Configuration :
log4net có thể theo dõi file cấu hình cho những thay đổi và tự động áp dụng thay đổi của cấu hình này. Mức ghi, appenders, bố trí, và chỉ là về mọi thứ khác có thể điều chỉnh trong thời gian chạy. Trong nhiều trường hợp, có thể chẩn đoán các vấn đề ứng dụng mà không chấm dứt quá trình được đề cập. Điều này có thể một công cụ rất có giá trị trong việc điều tra các vấn đề với các ứng dụng triển khai.

Bối cảnh Logging :
log4net có thể dùng cho thu thập dữ liệu ghi nội dung một cách rằng có minh bạch cho các nhà phát triển tại các điểm ghi. Những GlobalContext và ThreadContext cho phép các ứng dụng với lưu trữ dữ liệu theo ngữ cảnh được gắn cho thông điệp ghi. Ví dụ, trong một dịch vụ web, một khi người gọi có xác thực tên người dùng trong người gọi có thể lưu trữ trong một sở hữu ThreadContext. Sở hữu này sau đó sẽ thể tự động lưu lại như là một phần trong mỗi tin nhắn ghi tiếp theo được làm từ các chủ đề tương tự.

...
DangTrung

Kiến trúc .NET Framework

Chúng ta đã biết .NET Framework bao gồm ba phần là bộ thực thi ngôn ngữ chung (Common Language Runtime), các lớp lập trình hợp nhất hay còn gọi là các thư viện lớp cơ sở (Base Class Libraries) và một phiên bản cấu thành của Microsoft Active Server Pages gọi là Microsoftđ ASP.NET. Trên thực tế, ASP.NET và Windows Forms là hai thành phần nằm trong Base Class Libraries, nên trong một số tài liệu .NET Framework được giới thiệu bao gồm 2 phần chính là Common Language Runtime (CLR) và Base Class Libraries (BCL). Một trong các thành phần này đều có vai trò cực kỳ quan trọng trong việc phát triển các dịch vụ và các ứng dụng .NET.

Common Language Runtime (gọi tắt là bộ thực thi) được xây dựng trên các dịch vụ hệ điều hành. Nó chịu trách nhiệm thực hiện các ứng dụng và đảm bảo các phần liên quan đến ứng dụng đều được đáp ứng như quản lí bộ nhớ, an ninh bảo mật, tích hợp ngôn ngữ..v.v. Bộ thực thi bao gồm nhiều dịch vụ hỗ trợ phát triển và triển khai ứng dụng cũng như cải thiện tính đáng tin cậy của ứng dụng. Tuy vậy, những nhà phát triển trên thực tế không tương tác với CLR. Họ sử dụng một tập các thư viện lớp cơ sở được xây dựng bên trên bộ thực thi này thông qua các ngôn ngữ lập trình. Như là một phần của các lớp cơ sở, .NET Framework còn cung cấp một mô hình lập trình ứng dụng Web ASP.NET và Windows Forms (để xây dựng các ứng dụng trên Windows). Riêng ASP.NET cung cấp các thành phần và các dịch vụ ở mức cao hơn nhằm mục đích phát triển các dịch vụ và các ứng dụng Web XML. 

Common Language Runtime

Như các bạn đã biết, các ngôn ngữ lập trình khác nhau đều cung cấp một runtime (bộ thực thi) và .NET Framework không phải là một ngoại lệ. Tuy vậy bạn sẽ thấy bộ runtime này là khá đặc biệt so với phần lớn các runtime chúng ta vẫn sử dụng.
Common Language Runtime trong .NET Framework quản lý sự thực hiện mã và cung cấp sự truy cập vào nhiều loại dịch vụ giúp cho quá trình phát triển được dễ dàng hơn. CLR đã được phát triển ở tầm cao hơn so với các runtime trước đây như VB-runtime chẳng hạn, bởi nó đạt được những khả nǎng như tích hợp các ngôn ngữ, bảo mật truy cập mã, quản lý thời gian sống của đối tượng và hỗ trợ gỡ lỗi

Mã được biên dịch và hướng tới CLR có tên "managed code". "Managed code" cung cấp siêu dữ liệu (metadata) cần thiết cho CLR để cung cấp các dịch vụ hỗ trợ đa ngôn ngữ, bảo mật mã, quản lý thời gian sống của đối tượng và quản lý bộ nhớ.

Biên dịch mã quản lý (managed code)

.NET Framework đòi hỏi bạn phải sử dụng một trình biên dịch ngôn ngữ "nhắm" vào CLR như trình biên dịch Visual Basic .NET, C# .NET, C++ .NET hay JScript .NET của Microsoft. Chú ý rằng có nhiều trình biên dịch của đối tác thứ ba có trên thị trường như COBOL và Perl.

Sau khi sử dụng một trong các trình biên dịch ngôn ngữ, mã của bạn được biên dịch sang Microsoft Intermediate Language (MSIL hay đơn giản IL). IL là một tập các lệnh độc lập CPU có thể được chuyển đổi dễ dàng sang "native code". Siêu dữ liệu cũng được chứa bên trong IL.

IL độc lập với CPU có nghĩa mã IL không đáng tin cậy trên máy tính đặc thù sinh ra nó. Nói cách khác, nó có thể được chuyển từ một máy này sang một máy khác (miễn là máy tính hỗ trợ .NET Framework) mà không gặp bất cứ khó khǎn nào. Sau IL, mã mà bạn bắt đầu với nó sẽ được biên dịch bởi trình biên dịch JIT (Just-In-Time) tới mã máy hay "native code". IL chứa đựng mọi thứ cần thiết để làm điều này như nạp các chỉ lệnh và gọi các hàm (call methods) và một số các thao tác khác.

Trình biên dịch JIT

.NET Framework chứa đựng một hay nhiều trình biên dịch JIT có thể biên dịch mã IL của bạn ra mã máy hay mã cho CPU cụ thể. Điều đó được thực hiện khi ứng dụng chạy lần đầu tiên.

Bạn hãy chú ý quá trình này khi bạn xây dựng trang ASP.NET đầu tiên của mình. Sau khi bạn xây dựng một trang ASP.NET bất kỳ, bạn biên dịch trang này sang IL. Khi sử dụng trình duyệt và gọi trang bằng cách gõ URL của nó vào thanh địa chỉ, bạn chú ý một sự tạm dừng không đáng kể khoảng vài giây. Trên thực tế nó đang gọi mã IL và chuyển nó với một trình biên dịch JIT để để biên dịch sang mã máy. Điều đó chỉ xảy ra lần đầu khi một ai đó yêu cầu trang này. Sau lần đầu, bạn có thể gõ F5 để "refresh" lại trạng này và trang được thực hiện ngay lập tức. Trang đã được chuyển đổi sang mã máy và bây giờ được lưu giữ trong bộ nhớ. CLR biết rằng trình biên dịch JIT đã biên dịch trang. Chính vì thế, nó nhận được đầu ra của trang từ bộ nhớ. Nếu về sau bạn làm một sự thay đổi trang ASP.NET của bạn, hãy biên dịch lại, sau đó chạy trang lần nữa, CLR phát hiện ra có sự thay đổi file gốc. Nó sử dụng trình biên dịch JIT một lần nữa để biên dịch mã IL sang mã máy.

Trình biên dịch JIT đảm bảo, trong quá trình biên dịch sang mã máy, mã được an toàn kiểu (type safe). Điều đó có nghĩa những đối tượng luôn tách rời và chúng không cố ý làm hỏng một đối tượng khác.

Các Assembly

Trong các ứng dụng bạn xây dựng bên trong .NET Framework, các assembly luôn đóng một vai trò quan trọng. Các assembly có thể được hiểu như các khối hợp nhất (building block) của các ứng dụng của bạn. Nếu thiếu một assembly liên quan, mã sẽ không thể biên dịch được từ IL. Khi bạn đang sử dụng trình biên dịch để biên dịch mã từ mã được quản lý (managed code) sang mã máy, trình biên dịch JIT sẽ tìm kiếm mã IL được cất giữ trong một file PE cùng "assembly manifest" (bản kê khai assembly) có liên quan. Cứ mỗi lần bạn tạo một ứng dụng Web Form hay Windows Form trong .NET, thực tế bạn đang tạo ra một assembly. Cứ mỗi ứng dụng trong các ứng dụng này có chứa tối thiểu một assembly.

Trong Windows DNA, nơi các DLL và EXE là những "khối hợp nhất" (building block) của các ứng dụng, trong .NET, nó là assembly được sử dụng như một cơ sở cho các ứng dụng.
Trong Windows DNA và COM, có những trường hợp được tham chiếu đến như DLL hell. Các thành phần COM nói chung được thiết kế để chỉ có một phiên bản của thành phần COM này trên một máy tính tại bất kỳ thời gian đã cho nào. Bởi vì đặc tả COM không bao gồm cả thông tin phụ thuộc trong một định nghĩa kiểu của thành phần. Với .NET, điều đó bây giờ có thể có nhiều phiên bản của các component, hay các assembly, chạy trên cùng một server cạnh nhau. Một ứng dụng sẽ luôn luôn tìm kiếm assembly xây dựng nó.
Khi một ứng dụng được bắt đầu trong .NET, ứng dụng sẽ tìm kiếm một assembly trong thư mục cài đặt. Các assembly được lưu giữ trong một thư mục cài đặt được trỏ đến đến các private assembly. Nếu ứng dụng không tìm ra assembly trong thư mục cài đặt, ứng dụng sẽ quay ra GAC (Global Assembly Cache) để tìm chúng.

Cấu trúc của một assembly

Các assembly chứa mã được thực hiện bởi Common Language Runtime. Cái được lớn nhất của assembly là chúng "tự mô tả" (self-describing). Tất cả những chi tiết về assembly được cất giữ bên trong bản thân assembly đó. Trong Windows DNA, COM cất giữ tất cả dữ liệu "tự mô tả" của nó trong nơi đang ký (registry) của server, và như vậy việc cài đặt cũng như loại bỏ các thành phần COM có nghĩa dừng hoạt động (shutting down) IIS. Bởi vì một assembly .NET cất giữ thông tin này bên trong bản thân nó, nó có thể thực hiện chức nǎng XCOPY. Cài đặt một assembly cũng đơn giản như copy nó và điều đó là không cần thiết để dừng hay bắt đầu IIS trong nó đang hoạt động.

Các assembly được tạo ra bởi các phần sau :
  • Bản kê khai assembly (Assembly manifest)
  • Kiểu siêu dữ liệu (Type metadata)
  • Mã MSIL (Microsoft Intermediate Language code)
Assembly manifest là nơi các chi tiết của assembly được cất giữ. Còn assembly được cất giữ bên trong bản thân DLL hay EXE. Các assembly có thể là những file assembly đơn hay nhiều file, và bởi vậy assembly các assembly manifest được cất giữ trong assembly hay trong một file rời. assembly manifest cũng cất giữ số phiên bản của assembly để đảm bảo rằng ứng dụng luôn luôn được sử dụng đúng phiên bản. Khi bạn có nhiều phiên bản của một assembly trên cùng một máy tính, điều đó là rất quan trọng để gán nhãn chúng thật cẩn thận, như vậy CLR biết được phiên bản nào đang được sử dụng.

Các số phiên bản trong các assembly được xây dựng theo các cách sau: ...
Kiểu siêu dữ liệu (Type metadata) đã được hiểu như "dữ liệu về dữ liệu" (data about data). Siêu dữ liệu này chứa thông tin trên những kiểu được đưa ra bởi assembly như thông tin cho phép bảo mật, thông tin về giao diện và lớp và các thông tin về assembly khác.

Garbage collection (gom rác)

.NET Framework là một môi trường "gom rác". "Gom rác" là quá trình của sự phát hiện khi các đối tượng không còn được sử dụng và tự động phá hủy các đối tượng này, như vậy bộ nhớ được giải phóng.

"Gom rác" không phải là một khái niệm mới. Nó đã được sử dụng trong các ngôn ngữ khác từ khá lâu rồi. Trong thực tế, Java đã có một hệ thống "gom rác" đúng chỗ. Các ngôn ngữ khác như C++ không có "gom rác". Những nhà phát triển C++ được yêu cầu rất cẩn thận khi hủy bỏ một đối tượng và giải phóng bộ nhớ. Điều đó dẫn đến một số vấn đề thiếu hụt bộ nhớ. Nếu nhà phát triển quên giải phóng các đối tượng từ ứng dụng, việc cấp phát bộ nhớ của ứng dụng ngày càng tǎng, đôi khi là rất đáng kể. Việc giải phóng các đối tượng quá sớm sẽ nảy sinh lỗi ứng dụng; các kiểu lỗi này, trong phần lớn trường hợp, thường rất khó để theo dõi.

Trong .NET, bộ "gom rác" cho phép bạn khi làm việc mà không phải theo dõi mã cho những đối tượng không cần thiết và phá hủy chúng. bộ "gom rác" sẽ chú ý tất cả những điều này cho bạn. "Gom rác" không xảy ra ngay lập tức, nhưng thay vào đó bộ "gom rác" thỉnh thoảng sẽ "vun đống" để xác định những đối tượng nào sẽ phải phá hủy. Hệ thống mới này hoàn toàn miễn trách nhiệm cho người phát triển luôn phải tìm cách để sử dụng cũng như giải phóng bộ nhớ.

Với bộ "gom rác" mới này, bạn có thể điều khiển những khía cạnh nhất định của những hàm của nó, như nó làm việc "sau hậu trường" trong ứng dụng của bạn. Trong SDK documentation, tìm lớp System.GC để có thêm thông tin.

Base Class Libraries

Thư viện các lớp cơ sở .NET Framework cung cấp một tập các lớp ("APIs"), hướng đối tượng, có thứ bậc và có thể mở rộng và chúng được sử dụng bởi bất cứ ngôn ngữ lập trình nào. Như vậy, tất cả các ngôn ngữ từ Jscript cho tới C++ trở nên bình đẳng, và các nhà phát triển có thể tự do lựa chọn ngôn ngữ mà họ vẫn quen dùng.

Tập các lớp, các kiểu giá trị và giao diện này được tổ chức bằng một hệ thống các Namespace (xem định nghĩa phần dưới). Bảng 1 dưới đây đưa ra một mô tả chi tiết những Namespace có sẵn trong .NET Framework. Một điều rất quan trọng là chúng ta không chỉ giới hạn ở các Namespace này. Bạn có thể tự tạo ra Namespace và sử dụng chúng trong ứng dụng của bạn hay cũng có thể sử dụng các Namespace của đối tác thứ ba đang có đầy trên thị trường. Một ví dụ cho trường hợp này là Namespace System.Data.Oracle.

Bàn thêm về Namespace

.NET Framework được tạo bởi từ hàng trǎm lớp (class). Nhiều ứng dụng mà bạn xây dựng trong .NET đang tận dụng các lớp này theo cách này hay cách khác. Vì số lượng các lớp là quá lớn, .NET Framework tổ chức các lớp này vào một cấu trúc lớp được gọi là một namespace. Có một số lượng lớn các namespace và chúng được tổ chức theo cách dễ hiểu và minh bạch. System là một Namespace cơ sở trong .NET Framework. Tất cả các Namespace được cung cấp trong .NET framework bắt đầu với Namespace cơ sở này. Ví dụ, những lớp phục vụ việc truy cập và thao tác dữ liệu được tìm thấy trong Namespace System.Data. Những ví dụ khác bao gồm System.IO, System.XML, System.Collections, System.Drawing và .v.v.. Trong quy tắc đặt tên của Namespace, System.XML.XMLReader đại diện cho kiểu XMLReader, nó thuộc Namespace System.XML.

Sau đây là hai đoạn mã ví dụ có sử dụng Namespace trong VB.NET và C#

VB:
Imports System
     Public Module HelloWorld
           Sub Main()
                 Console.WriteLine ("Hello World !")
           End Sub
     End Module

C#:
using System;
     Class HelloWorld {public static void Main()
     {
            Console.WriteLine ("Hello World !");
      }
}

ASP.NET

ASP.NET là một tập các lớp nằm trong thư viện lớp cơ sở. ASP.NET cung cấp một mô hình ứng dụng Web dưới dạng một tập các control (đối tượng điều khiển) và cơ sở hạ tầng giúp bạn tạo ra các ứng dụng Web một cách dễ dàng. Các control này được xây dựng cho các ứng dụng trên máy phục vụ (hay còn gọi là Web Forms) phản ánh những control giao diện người dùng HTML đặc thù như Listbox, Textbox và Button và một tập bổ sung các control Web phức tạp hơn như calendars chẳng hạn. Một đặc tính quan trọng của các control trên là chúng được viết để thích nghi với những khả nǎng của các ứng dụng máy khách. Nói cách khác các đối tượng điều khiển Web forms có thể "đánh hơi" thấy máy khách đang yêu cầu một trang (page) và trả lại người dùng một cách thích hợp (ví dụ như WML cho phone hay Dynamic HTML cho Internet Explorer 5.5).

ASP.NET cũng cung cấp những đặc tính như quản lý trạng thái "cluster session" và phục hồi tiến trình giúp giảm bớt số lượng mã mà một người phát triển phải viết và tǎng độ tin cậy ứng dụng. Ngoài ra ASP.NET cho phép các nhà phát triển chuyển giao phần mềm như là một dịch vụ. Khi sử dụng những đặc tính các dịch vụ Web XML ASP.NET, các nhà phát triển ASP.NET có thể viết những giao dịch logic đơn giản và cơ sở hạ tầng ASP.NET sẽ chịu trách nhiệm chuyển dịch vụ đó theo đường SOAP  và các giao thức công cộng khác. ASP.NET làm việc với mọi ngôn ngữ và công cụ (bao gồm cả Visual Basic, C++, C#, và JScript).

Bên trong ASP.NET

Tại lõi của ASP.NET là HTTP-runtime (bộ thực thi HTTP), một "động cơ" thực hiện với hiệu suất cao khi xử lý các lệnh HTTP. HTTP-runtime có trách nhiệm xử lý tất cả những yêu cầu HTTP gửi đến, giải quyết URL của mỗi yêu cầu tới một ứng dụng, và sau đó gửi yêu cầu tới ứng dụng cho việc xử lý sau này. HTTP-runtime có tính đa luồng và xử lý các yêu cầu không đồng bộ. Hơn nữa, HTTP-runtime được thiết kế mang tính phục hồi cao, như vậy nó có thể phục hồi một cách tự động từ những vi pham khi truy nhập.

Ngoài ra ASP.NET còn có khả nǎng như cập nhật ứng dụng, có thể mở rộng, quản lý và cất giữ trạng thái và nhiều tính nǎng cao cấp khác.

DangTrung.

Thứ Ba, 26 tháng 2, 2008

Tìm Hiểu Về .Net Framework.

Những điểm đặc trưng của .NET Framework

Như được đề cập trong các bài trước, .NET Framework là cơ sở hạ tầng cho việc xây dựng, triển khai và chạy các ứng dụng và dịch vụ Web. Nó cung cấp một môi trường đa ngôn ngữ, dựa trên nền các chuẩn với hiệu nǎng cao, cho phép tích hợp những đầu tư ban đầu với các ứng dụng và dịch vụ thế hệ kế tiếp và giải quyết những thách thức của việc triển khai và vận hành các ứng dụng trên quy mô Internet. Cơ sở hạ tầng NET Framework bao gồm ba phần chính là Bộ thực hiện ngôn ngữ chung (Common Language Runtime), một tập phân cấp các thư viện lớp hợp nhất (Unified Class Libraries) và ASP.NET.

Thực tế .NET Framework là kết quả của hai dự án lớn của Microsoft:
  • Dự án đầu tiên nhằm mục đích cải tiến công việc phát triển các ứng dụng trên nền Windows, hãy nhìn cụ thể vào công việc cải tiến COM (Component Object Model - Mô hình Đối tượng Thành phần) của Microsoft.
  • Dự án thứ hai tập trung tạo ra nền tảng cho việc chuyển giao phần mềm như một dịch vụ. Sản phẩm này đã cải thiện đáng kể nǎng suất cho người phát triển, đơn giản hóa công việc triển khai và thực thi ứng dụng một cách đáng tin cậy.
Dự án cũng đưa ra một khái niệm hoàn toàn mới trong việc tính toán: khái niệm của các dịch vụ Web (các ứng dụng được "ghép nối lỏng") và các thành phần được thiết kế cho mô hình tính toán hỗn tạp hiện tại thông qua truyền thông có sử dụng các giao thức Internet chuẩn như XML và SOAP.

Hoàn cảnh ra đời

Phát triển Web

Khi Web mới bắt đầu được tạo ra, về cơ bản nó là một hệ thống tập tin chỉ có thể đọc, với ưu điểm là nó sử dụng những chuẩn và giao thức công nghiệp, cho phép truy cập dễ dàng đến nội dung các tập tin.

Vào buổi ban đầu, Web được phát triển bởi ngôn ngữ lập trình C và CGI. Thêm vào đó, phần lớn các ứng dụng Web được xây dựng trên những kiến trúc hai lớp (two-tier), gây ra những thách thức xung quanh khả nǎng biến đổi và tích hợp ứng dụng. Lấy một ví dụ cho vấn đề này là một Website kinh doanh các thanh rèm cửa nhưng lại không bán các rèm cửa, bắt buộc khách hàng phải tìm hiểu ít nhất là hai site khác nhau để có thể mua một bộ rèm cửa (bao gồm thanh và rèm của) cho cửa sổ của họ. Những vấn đề kiểu như thế này cũng đã được đề cập ở các bài trước.

Từ những ưu thế của COM và sự ra đời các công nghệ như Active Server Pages (ASP) của Microsoft nǎm 1996, các Website cho ra nhiều tương tác người dùng hơn. ASP thực hiện điều đó một cách dễ dàng để gọi các lôgic doanh nghiệp và các dịch vụ nền tảng mà người phát triển cần thiết thông qua các ngôn ngữ script đơn giản. Với sự hỗ trợ cho COM, các ứng dụng được viết một cách dễ dàng thông qua khả nǎng "đóng gói" lôgic doanh nghiệp này vào trong các khối mô-đun được viết trong một phạm vi rộng các ngôn ngữ lập trình phổ biến như Microsoft Visual Basic, C++ hay COBOL. Mặc dù vậy, những chiến lược này cho công việc hợp nhất các ứng dụng vẫn còn có thiếu sót.

Những tiến bộ trong việc phát triển Web nhanh chóng chuyển từ kiến trúc hai lớp (two-tier) sang một thiết kế N lớp (N-tier) mà cho phép một chiến lược hợp nhất đa dạng hơn qua việc đưa ra các đối tượng doanh nghiệp hay lôgic tầng giữa (middle-tier) tới việc hợp nhất Web với đối tác. Những thách thức trong việc thử sử dụng lôgic doanh nghiệp được "đóng gói" theo kiểu này là phần lớn các ứng dụng được thiết kế trên nền các giao thức độc quyền, "ghép nối chặt".

Giải pháp: Các dịch vụ Web XML

Để giải quyết những thách thức trong việc phát triển Internet hiện tại và tương lai, chúng ta phải có khả nǎng viết các ứng dụng trên bất cứ ngôn ngữ lập trình nào, truy nhập vào bất cứ nền tảng nào. Chiến lược phát triển ứng dụng rất hấp dẫn này cho phép các công ty tận dụng các hệ thống phần cứng, các ứng dụng hiện hành và thuê các nhà phát triển có sẵn, mà không cần "bắt" họ phải chuyển sang một ngôn ngữ lập trình mới.

Giải pháp này gọi là các dịch vụ Web XML và nó đại diện cho việc phát triển ứng dụng cho thế hệ kế tiếp. Một dịch vụ Web XML là một ứng dụng cho khả nǎng hoạt động của nó theo chương trình qua Internet hay intranet khi sử dụng những giao thức và những chuẩn Internet như HTTP và XML.

Các dịch vụ Web XML giải quyết những thách thức đối với người phát triển Web thông qua kết hợp "ghép nối chặt", những ưu thế của việc tính toán N-tier với "ghép nối lỏng", và những khái niệm hướng thông điệp của Web. Bạn hãy coi các dịch vụ Web XML như lập trình thành phần trên Web.

Mục đích thiết kế .NET Framework

.NET Framework là thành quả tối ưu của sự kết hợp công sức và trí tuệ của Microsoft, nhằm tạo ra một nền tảng cho việc xây dựng và triển khai nhanh chóng các dịch vụ và ứng dụng Web XML. Tầm nhìn của nền tảng .NET Framework kết hợp một mô hình lập trình đơn giản, dễ sử dụng với các giao thức mở và biến đổi được của Internet. Để đạt được tầm nhìn này, việc thiết kế .NET Framework nhằm một số mục đích:
  • Sự hợp nhất thông qua các chuẩn Internet công cộng: Để giao tiếp với những đối tác kinh doanh, những khách hàng phụ thuộc vào các khu vực theo vị trí địa lý, thậm trí cả những ứng dụng cho tương lai, những giải pháp phát triển cần được đề nghị hỗ trợ cho các chuẩn Internet mở và tích hợp chặt chẽ với các giao thức mà không bắt buộc người phát triển phải thông hiểu cơ sở hạ tầng bên dưới nó.
  • Khả nǎng biến đổi được thông qua một kiến trúc "ghép nối lỏng": Đa số các hệ thống lớn, biến đổi được trên thế giới được xây dựng trên những kiến trúc không đồng bộ dựa trên nền thông điệp (message-based). Nhưng công việc xây dựng các ứng dụng trên một kiến trúc như vậy thường phức tạp và có ít các công cụ hơn so với những môi trường phát triển ứng dụng N lớp (N-tier) "ghép nối chặt". .NET Framework được xây dựng để đem lại những lợi thế về nǎng suất của kiến trúc "ghép nối chặt" với khả nǎng biến đổi được và vận hành với nhau của kiến trúc "ghép nối lỏng".
  • Hỗ trợ nhiều ngôn ngữ: Các nhà phát triển sử dụng những ngôn ngữ khác nhau do mỗi ngôn ngữ riêng có những ưu thế đặc thù : một số ngôn ngữ đặc biệt thích hợp với thao tác toán học; một số khác lại đa dạng ở các hàm tính toán tài chính v.v. .NET Framework cho phép các ứng dụng được viết trong nhiều ngôn ngữ lập trình khác nhau và chúng có khả nǎng tích hợp với nhau một cách chặt chẽ. Ngoài ra, với .NET Framework, các công ty còn có thể tận dụng những lợi thế của kỹ nǎng phát triển sẵn có mà không cần phải đào tạo lại và cho phép những người phát triển sử dụng ngôn ngữ mà họ ưa thích.
  • Nâng cao nǎng suất cho các nhà phát triển: Với số lượng các nhà phát triển ứng dụng không nhiều nên mỗi giờ làm việc họ phải cho ra kết quả công việc cụ thể. Các nhóm phát triển với .NET Framework có thể loại bỏ những công việc lập trình không cần thiết và tập trung vào viết các lôgic doanh nghiệp. Chẳng hạn như .NET Framework có ưu điểm tiết kiệm thời gian như thực hiện các giao dịch tự động và dễ sử dụng, quản lý bộ nhớ một cách tự động và có chứa một tập các đối tượng điều khiển đa dạng bao hàm nhiều tác vụ phát triển chung.
  • Bảo vệ những sự đầu tư thông qua việc bảo mật đã được cải tiến: Một trong những vấn đề liên quan lớn nhất đến Internet hiện nay là bảo mật. Kiến trúc bảo mật của .NET Framework được thiết kế từ dưới lên để đảm bảo các ứng dụng và dữ liệu được bảo vệ thông qua một mô hình bảo mật dựa-trên-bằng-chứng (evidence-based) và tinh vi.
  • Tận dụng những dịch vụ của hệ điều hành: Windows cung cấp một số lượng đa dạng các dịch vụ có sẵn với bất kỳ nền tảng nào; như truy cập dữ liệu một cách toàn diện, bảo mật tích hợp, các giao diện người dùng tương tác, mô hình đối tượng thành phần đáng tin cậy và các giám sát quá trình giao dịch. .NET Framework đã tận dụng lợi thế đa dạng và phong phú này để đưa ra cho mọi người theo cách dễ sử dụng nhất.

Những đặc tính của .NET Framework

Hỗ trợ các chuẩn dịch vụ Web XML

Sự sử dụng ngôn ngữ đánh dấu mở rộng XML ở khắp mọi nơi: XML là một định dạng dữ liệu cho việc trao đổi tài liệu lẫn nhau có cấu trúc trên Web. .NET Framework sử dụng XML ở khắp mọi nơi từ việc mô tả các đối tượng cho đến bảo mật các tập tin cấu hình.
  • Khả nǎng vận hành với nhau qua việc hỗ trợ SOAP: .NET Framework cho phép những người phát triển đưa ra và sử dụng các dịch vụ Web XML một cách trong suốt (transparently) thông qua SOAP (Simple Object Access Protocol), một vǎn phạm XML chuẩn tạo khả nǎng thao tác giữa các phần trong ứng dụng.
  • Mô tả dễ dàng các dịch vụ Web XML với WSDL: .NET Framework tạo ra những mô tả WSDL (Web Services Description Language - Ngôn ngữ Mô tả các Dịch vụ Web) cho các dịch vụ Web XML.
  • Đưa ra những dịch vụ Web với SOAP Discovery (viết tắt Disco): SOAP Discovery cung cấp cơ chế bởi những dịch vụ Web XML nào được tìm thấy trên một máy phục vụ Web (Web server) ; .NET Framework cung cấp một cách thức để công bố các dịch vụ Web XML thông qua SOAP Discovery.
  • Hỗ trợ UDDI: .NET Framework sử dụng UDDI (Universal Description, Discovery and Integration) cho phép những dịch vụ Web XML cung cấp cơ chế bởi những dịch vụ Web XML nào được tìm thấy trên Internet.

Hiệu suất cho người phát triển

  • Tích hợp nhiều ngôn ngữ lập trình: .NET Framework cung cấp khả nǎng tích hợp ngôn ngữ lập-trình-chéo (cross-programming language), chặt chẽ, thúc đẩy nǎng suất do sự cho phép người phát triển mở rộng những thành phần một ngôn ngữ lập trình bên trong một ngôn ngữ khác theo cách kế thừa ngôn-ngữ-chéo (cross-language), gỡ lỗi và xử lý lỗi.
  • "Versioning" tự động là phần của bản chất tự mô tả của mỗi thành phần và ứng dụng .NET Framework ở chỗ mỗi thành phần đó có một tên (name) duy nhất được lưu giữ bên trong. Do các ứng dụng kết các tên duy nhất của các thành phần lại với nhau, bộ thực hiện (runtime) của .NET Framework có khả nǎng điều khiển ?versioning? của những thành phần dùng chung một cách thông minh và làm mất đi cái gọi là "DLL hell".
  • Triển khai theo kiểu "No-touch" (không can thiệp): .NET Framework bao hàm những đặc tính được cải tiến cho việc triển khai các ứng dụng. Việc cài đặt một ứng dụng vào trong hệ thống cũng đơn giản như việc sao chép nó vào trong một thư mục đích và cho nó chạy mà không cần đǎng ký như Windows Registry.
  • Quản lý bộ nhớ tự động: .NET Framework là một môi trường "gom rác" (garbage-ollected). Công việc "gom rác" giải phóng các ứng dụng sử dụng các đối tượng .NET Framework từ sự cần thiết loại bỏ dứt khoát các đối tượng này và làm giảm đi những lỗi lập trình chung không đáng có.
  • Các thành phần tự-mô-tả: Siêu dữ liệu (metadata) mà mỗi đối tượng trong .NET Framework chứa đựng cho phép bộ thực hiện (runtime) "chất vấn" các đối tượng về những kiểu dữ liệu, chức nǎng hoạt động, v.v. để xác định các đối tượng đã được gọi đúng cách chưa hơn là để cho lời gọi xảy ra và nhận lấy thất bại. Đặc tính này được gọi là "reflection".
  • Mô hình điều khiển giao diện người dùng ASP.NET và các đối tượng điều khiển được cải thiện làm tǎng thêm nǎng suất và hiệu quả do việc "đóng gói" những tương tác phức tạp trong các thành phần (component) trên máy phục vụ.
  • Sự tách biệt giữa mã và nội dung cho phép người phát triển và người tạo ra nội dung làm việc song song với nhau do việc lưu giữ nội dụng trong một file tách biệt khỏi các mã của ứng dụng.
  • Tích hợp nền tảng chặt chẽ: .NET Framework cho phép những nhà phát triển sử dụng tất cả các ứng dụng Windows và các dịch vụ hiện hữu. Với ưu thế đó, người phát triển có thể sử dụng mã đang tồn tại trong khi tận dụng những lợi điểm, thế mạnh trong .NET Framework.
  • Viết ít mã hơn: do .NET Framework sử dụng thiết kế "thành phần hóa" cao, những nhà phát triển có thể tập trung vào việc viết lôgic doanh nghiệp hơn là những công việc như quản lý bộ nhớ, quản lý trạng thái hay xác định khả nǎng của một trình duỵệt client?

Sự nhạy cảm khi giải quyết các thách thức đối với doanh nghiệp thời nay

  • Hỗ trợ những chuẩn Internet công cộng: Những chuẩn được xem là phần lõi để chuyển giao phần mềm như là một dịch vụ. Microsoft trình bày những đặc tả cho ngôn ngữ lập trình C# và cơ sở hạ tầng ngôn ngữ chung CLI (Common Language Infrastructure) và chuyển tới ECMA cho việc chuẩn hóa.
  • Hỗ trợ dị bộ (không đồng bộ): .NET Framework tích hợp hai công nghệ truyền thông dị bộ cho khả nǎng biến đổi được và tính đáng tin cậy: SOAP và MSMQ (Microsoft Message Queuing Services).
  • Hỗ trợ giao dịch: Những nhà phát triển ứng dụng có thể thực hiện cả những công việc thao tác .NET Framework bên trong các giao dịch có chứa những hoạt động khác như cập nhật CSDL chẳng hạn. .NET Framework hỗ trợ các giao dịch thông qua MTS (Microsoft Transaction Services - các Dịch vụ Giao dịch của Microsoft) và COM+[16] và cung cấp một giao diện XA tương hợp các chuẩn.
  • Biên dịch ASP.NET làm tǎng khả nǎng thực hiện bởi việc biên dịch các trang thay vì phải thông dịch chúng.
  • Giám sát phiên ASP.NET tự động và khởi động lại làm tǎng thêm độ tin cậy qua việc giám sát chạy các ứng dụng ASP.NET và thậm chí dừng và bắt đầu lại quá trình chạy nếu thấy cần thiết.
  • Truy nhập dữ liệu toàn bộ với ADO.NET: .NET Framework có chứa ADO.NET, một giao diện hiệu nǎng truy nhập tới bất kỳ một CSDL nào được thiết kế riêng cho kiểu "ghép nối lỏng". ADO.NET cung cấp các dịch vụ truy cập dữ liệu cho các ứng dụng trên nền Web biến đổi được và các dịch vụ Web XML, bao gồm cả sự hỗ trợ mô hình dữ liệu đang kết nối (connected) cũng như ngừng kết nối (disconnected).

Cải thiện các thao tác

  • An ninh bảo mật dựa trên nền tảng bằng chứng (evidence-based): Hệ thống bảo mật truy cập mã của .NET Framework cho phép các nhà phát triển định ra những "giấy phép" được yêu cầu rằng mã của họ cần để hoàn thành sản phẩm. Bộ thực thi ngôn ngữ chung (common language runtime) chịu trách nhiệm bảo đảm rằng những "giấy phép" này là phù hợp hay bị loại bỏ, phụ thuộc vào chứng cớ bao gồm nhận diện người dùng, nhận diện mã, mã nào thực sự đang được sử dụng, mã được bắt nguồn từ nơi nào?
  • Windows Authentication tích hợp: .NET Framework cũng tích hợp với Windows Authentication (Chứng thực Windows). Windows Authentication tích hợp trước đây được biết như chứng thực NT LAN Manager và Windows NT Challenge/Response. Trong Windows Authentication tích hợp, trình duyệt cố gắng sử dụng những (giấy) ủy nhiệm của người dùng hiện hành từ một đǎng nhập tên miền. Nếu những ủy nhiệm này không được chấp nhận thi Windows Authentication tích hợp sẽ nhắc người dùng cho một tên và mật khẩu người dùng thông qua một hộp thoại. Khi Windows Authentication tích hợp đang được sử dụng thì mật khẩu người dùng không qua được từ máy khách đến máy phục vụ. nếu một người dùng đã đǎng nhập như là một người sử dụng tên miền trên một máy tính cục bộ, người dùng sẽ không bị chứng thực lần nữa khi truy nhập một máy tính mạng trong miền đó.
  • Chứng thực Internet: Người dùng Internet thường cần những cơ chế chứng thực khác nhau. Các ứng dụng dùng .NET Framework có thể nắm lấy lợi thế và được cấu hình cho chứng thực sử dụng một sự kết hợp của máy phục vụ Web (Web server) và các nhà cung cấp chứng thực .NET Framework.
  • Hiệu suất được cải thiện: .NET Framework cải thiện hiệu suất các ứng dụng Web đặc thù. ASP.NET sử dụng khả nǎng tối ưu hoá cho những bộ xử lý nào đó và với việc cất giữ một cách linh động ASP.NET có thể cải thiện hiệu suất hơn hai đến ba lần so với các ứng dụng ASP hiện hành.
  • Sự tin cậy vững chắc: Giành được sự tin cậy mức xí nghiệp với .NET Framework, thông qua việc quản lý bộ nhớ một cách tự động, tính tương thích phiên bản có bảo hành, vòng lặp chu kỳ ứng dụng động và các dịch vụ xí nghiệp đã được cung cấp bởi COM+.
Trên đây là những đặc trưng, những ưu điểm của .NET Framework. Để hiểu rõ những khả nǎng mà .NET Framework có thể cung cấp và hiểu sâu hơn những gì mà chúng ta đã trình bày ở trên, các bạn có thể tìm đọc Ba thành phần của .NET Framework.

DangTrung.

Thứ Hai, 25 tháng 2, 2008

Tìm Hiểu NHibernate

Có lẽ khi nói đến .NET Framework chúng ta thường cho rằng những kiến thức đó là không cần thiết nhiều về cách định nghĩa nó mà chúng ta nên tìm hiểu sâu về cách sử dụng nó. Tôi đã từng như các bạn. Thật ra chúng ta thường thường tìm hiểu về cái Advance của nó nhưng chúng ta không quan tâm nhiều đến cái gọi là Basic của nó. Có nhiều người có thể làm rất tôt nhưng khi hỏi về .NET Framework là gì họ cũng khó có thể nói chi tiết và chuyên sâu về nó tôi cũng như vậy nhưng những kiến thức mà tôi được biết có lẽ sẽ giúp ích được một chút cho các bạn


.NET Framework: bao gồm ba phần là bộ thực thi ngôn ngữ chung (Common Language Runtime), các lớp lập trình hợp nhất hay còn gọi là các thư viện lớp cơ sở (Base Class Libraries) và một phiên bản cấu thành của Microsoft Active Server Pages gọi là Microsoftđ ASP.NET. Trên thực tế, ASP.NET và Windows Forms là hai thành phần nằm trong Base Class Libraries, nên trong một số tài liệu .NET Framework được giới thiệu bao gồm 2 phần chính là Common Language Runtime (CLR) và Base Class Libraries (BCL). Một trong các thành phần này đều có vai trò cực kỳ quan trọng trong việc phát triển các dịch vụ và các ứng dụng .NET.
Common Language Runtime (gọi tắt là bộ thực thi) được xây dựng trên các dịch vụ hệ điều hành. Nó chịu trách nhiệm thực hiện các ứng dụng và đảm bảo các phần liên quan đến ứng dụng đều được đáp ứng như quản lí bộ nhớ, an ninh bảo mật, tích hợp ngôn ngữ..v.v. Bộ thực thi bao gồm nhiều dịch vụ hỗ trợ phát triển và triển khai ứng dụng cũng như cải thiện tính đáng tin cậy của ứng dụng. Tuy vậy, những nhà phát triển trên thực tế không tương tác với CLR. Họ sử dụng một tập các thư viện lớp cơ sở được xây dựng bên trên bộ thực thi này thông qua các ngôn ngữ lập trình. Như là một phần của các lớp cơ sở, .NET Framework còn cung cấp một mô hình lập trình ứng dụng Web ASP.NET và Windows Forms (để xây dựng các ứng dụng trên Windows). Riêng ASP.NET cung cấp các thành phần và các dịch vụ ở mức cao hơn nhằm mục đích phát triển các dịch vụ và các ứng dụng Web XML.


Nhibernate: là một giải pháp kĩ thuật ánh xạ từ mô hình hướng đối tượng xuống cơ sở dữ liệu quan hệ (Object-relational mapping (ORM) ) cho nền tảng Microsoft.NET. Nó cung cấp một giải pháp để mapping đến cơ sở dữ liệu một cách dễ dàng. Nó cung cấp cho chúng ta các phương thức thao tác với cơ sở dữ liệu và tạo ra các dữ liệu chuẩn dưới dạng các object. khi đó chúng ta sẽ thao tác với dữ liệu thông qua các object. tất cả các dữ liệu được lấy lên hoặc lưu lại sẽ được lưu vao bộ nhớ của máy. nó sẽ được load lại hoặc đẩy xuống khi chúng ta thực hiện đẩy xuống hoặc load cơ sở dữ liệu.


DangTrung.

Chủ Nhật, 24 tháng 2, 2008

Những Ví Dụ Cơ Bản Trong LINQ

Đây là các ví dụ cơ bản tường gặp trong quá trình phát triển ứng dụng. Như lấy độ dài chuổi, lấy một phần tử bất kỳ trong mãng dữ liệu, tổng số phần tử trong mãng ....

static string[] presidents =
       {
           "Adams", "Arthur", "Buchanan", "Bush", "Carter", "Cleveland",
           "Clinton", "Coolidge", "Eisenhower", "Fillmore", "Ford", "Garfield",
           "Grant", "Harding", "Harrison", "Hayes", "Hoover", "Jackson",
           "Jefferson", "Johnson", "Kennedy", "Lincoln", "Madison", "McKinley",
           "Monroe", "Nixon", "Pierce", "Polk", "Reagan", "Roosevelt", "Taft",
           "Taylor", "Truman", "Tyler", "Van Buren", "Washington", "Wilson"
       };
       static string[] strings = { "one", "two", null, "three" };
       static string[] numbers = { "0042", "010", "9", "27" };

       static void Main(string[] args)
       {
           //All Prototype Where Every Element Causes the Predicate to Return True
           bool all = presidents.All(s => s.Length > 3);
           Console.WriteLine(all);

           //First Contains Prototype Where No Element Matches the Specified Value
           bool contains = presidents.Contains("Rattz");
           Console.WriteLine(contains);

           //The First Count Prototype
           int fcount = presidents.Count();
           Console.WriteLine(fcount);

           //The Second Count Prototype
           int scount = presidents.Count(s => s.StartsWith("J"));
           Console.WriteLine(scount);

           //An Example of the Second Min Prototype
           string minName = presidents.Min();
           Console.WriteLine(minName);

           //An Example of the Second Max Prototype
           string maxName = presidents.Max();
           Console.WriteLine(maxName);

           //A Query Using the Standard Dot Notation Syntax
           IEnumerable sequence = presidents.Where(n => n.Length < 6).Select(n => n);
           foreach (string name in sequence)            
               Console.WriteLine("{0}", name);            

           //The Equivalent Query Using the Query Expression Syntax
           IEnumerable sequence1 = from n in presidents where n.Length < 6 select n;
           foreach (string name in sequence1)            
               Console.WriteLine("{0}", name);

           //A Simple LINQ to Objects Query
           string president = presidents.Where(p => p.StartsWith("Lin")).First();
           Console.WriteLine(president);

           //A Trivial Sample Query
           IEnumerable items = presidents.Where(p => p.StartsWith("A"));
           foreach (string item in items)
               Console.WriteLine(item);

           //A Trivial Sample Query with an Intentionally Introduced Exception
           IEnumerable items1 = presidents.Where(s => Char.IsLower(s[4]));
           Console.WriteLine("After the query.");
           foreach (string item in items1)
               Console.WriteLine(item);

           // Create an array of ints.
           int[] ints = new int[] { 1, 2, 3, 4, 5, 6 };
           // Declare our delegate.
           Func GreaterThanTwo = i => i > 2;
           // Perform the query ... not really. Don't forget about deferred queries!!!
           IEnumerable intsGreaterThanTwo = ints.Where(GreaterThanTwo);
           // Display the results.
           foreach (int i in intsGreaterThanTwo)
               Console.WriteLine(i);

           //Another Example of the First Select Prototype
           var nameObjs = presidents.Select(p => new { p, p.Length });
           foreach (var item in nameObjs)
               Console.WriteLine(item);

           //A Third Example of the First Select Prototype
           var nameObjs1 = presidents.Select(p => new { LastName = p, Length = p.Length });
           foreach (var item in nameObjs1)
               Console.WriteLine("{0} is {1} characters long.", item.LastName, item.Length);

           //An Example of the Second Select Prototype
           var nameObjs2 = presidents.Select((p, i) => new { Index = i, LastName = p });
           foreach (var item in nameObjs2)
               Console.WriteLine("{0}. {1}", item.Index + 1, item.LastName);

           //An Example of the First SelectMany Prototype
           IEnumerable chars = presidents.SelectMany(p => p.ToArray());
           foreach (char ch in chars)
               Console.WriteLine(ch);

           //An Example of the Second SelectMany Prototype
           IEnumerable chars1 = presidents.SelectMany((p, i) => i < 5 ? p.ToArray() : new char[] { });
           foreach (char ch in chars1)
               Console.WriteLine(ch);

           //A More Complex Example of the First SelectMany Prototype
           Employee[] employees = Employee.GetEmployeesArray();
           EmployeeOptionEntry[] empOptions = EmployeeOptionEntry.GetEmployeeOptionEntries();
           var employeeOptions = employees.SelectMany(e => empOptions.Where(eo => eo.id == e.id).Select(eo => new
           {
               id = eo.id,
               optionsCount = eo.optionsCount
           }));
           foreach (var item in employeeOptions)
               Console.WriteLine(item);
         
           //An Example of the Only Take Prototype
           IEnumerable items2 = presidents.Take(5);
           foreach (string item in items2)
               Console.WriteLine(item);

           //Another Example of the Take Prototype
           IEnumerable chars2 = presidents.Take(5).SelectMany(s => s.ToArray());
           foreach (char ch in chars2)
               Console.WriteLine(ch);

           //An Example of Calling the First TakeWhile Prototype
           IEnumerable items3 = presidents.TakeWhile(s => s.Length < 10);
           foreach (string item in items3)
               Console.WriteLine(item);

           //An Example of Calling the Second TakeWhile Prototype
           IEnumerable items4 = presidents.TakeWhile((s, i) => s.Length < 10 && i < 5);
           foreach (string item in items4)
               Console.WriteLine(item);

           //An Example of the Only Skip Prototype
           IEnumerable items5 = presidents.Skip(1);
           foreach (string item in items5)
               Console.WriteLine(item);

           //An Example Calling the First SkipWhile Prototype
           IEnumerable items6 = presidents.SkipWhile(s => s.StartsWith("A"));
           foreach (string item in items6)
               Console.WriteLine(item);

           //An Example of Calling the Second SkipWhile Prototype
           IEnumerable items7 = presidents.SkipWhile((s, i) => s.Length > 4 && i < 10);
           foreach (string item in items7)
               Console.WriteLine(item);

           //An Example Calling the Only Concat Prototype
           IEnumerable items8 = presidents.Take(5).Concat(presidents.Skip(5));
           foreach (string item in items8)
               Console.WriteLine(item);

           //An Example Performing Concatention with an Alternative to Using the Concat Operator
           IEnumerable items9 = new[] {presidents.Take(5),presidents.Skip(5)}.SelectMany(s => s);
           foreach (string item in items9)
               Console.WriteLine(item);

           //An Example Calling the First ThenBy Prototype
           IEnumerable items10 = presidents.OrderBy(s => s.Length).ThenBy(s => s);
           foreach (string item in items10)
               Console.WriteLine(item);

           /*//An Example Calling the Second OrderBy Prototype
           MyVowelToConsonantRatioComparer myComp = new MyVowelToConsonantRatioComparer();
           IEnumerable namesByVToCRatio = presidents.OrderBy((s => s), myComp);
           foreach (string item in namesByVToCRatio)
           {
               int vCount = 0;
               int cCount = 0;

               myComp.GetVowelConsonantCount(item, ref vCount, ref cCount);
               double dRatio = (double)vCount / (double)cCount;
               Console.WriteLine(item + " - " + dRatio + " - " + vCount + ":" + cCount);
           }*/
       }

       //Converting an Array of Strings to Integers
       private static void ConvertingStringToIntegers()
       {           
           //Converting an Array of Strings to Integers
           int[] nums = numbers.Select(s => Int32.Parse(s)).ToArray();

           //Converting an Array of Strings to Integers and Sorting It
           int[] numsort = numbers.Select(s => Int32.Parse(s)).OrderBy(s => s).ToArray();
       }

       //Query with Intentional Exception Deferred Until Enumeration

   }


Ví dụ sắp xếp theo kiểu Datetime :

List.OrderByDescending(m => m.CreatedDate , new DateTimeComparer());

Code class DateTimeComparer:

private class DateTimeComparer : IComparer
   {
       #region IComparer Members

       int IComparer.Compare(string x, string y)
       {
           DateTime xDate = DateTime.MinValue;
           DateTime yDate = DateTime.MinValue;
           if (!string.IsNullOrEmpty(x))
               xDate = DateTime.Parse(x, new System.Globalization.CultureInfo("en-US"));
           if (!string.IsNullOrEmpty(y))
               yDate = DateTime.Parse(y, new System.Globalization.CultureInfo("en-US"));

           return (Comparer.Default.Compare(xDate, yDate));
       }
       #endregion
   }
 

Ngoài ra Linq còn rất nhiều tính khả dụng. Ví dụ phức tạp dưới đây về sort ma trận.

public static void TestSortMatrix()
       {
           List source1 = new List() { "aa5", "aa6","aa1", "aa2", "aa3", "aa4"  };
           List source2 = new List() { "bb1", "bb2", "bb3", "bb4", };
           List source3 = new List() { "cc1", "cc2", "cc3", "cc4", "cc5" };
           List source4 = new List() { "dd1", "dd2", "dd5", "dd6", "dd3", "dd4"  };
           List> source = new List>();
           source.Add(source1);
           source.Add(source2);
           source.Add(source3);
           source.Add(source4);

           List> listAll = source.SelectMany(
               (it) => it.Select((t, i) => new { t, i })).GroupBy(z => z.i).Select(
               g => g.Select(z => z.t).ToList()).ToList();

       }


DangTrung.

Thứ Bảy, 23 tháng 2, 2008

Tìm Hiểu Về LINQ

LINQ to SQL là một phiên bản hiện thực hóa của O/RM (object relational mapping) có bên trong .NET Framework bản “Orcas” (nay là .NET 3.5), nó cho phép bạn mô hình hóa một cơ sở dữ liệu dùng các lớp .NET. Sau đó bạn có thể truy vấn cơ sở dữ liệu (CSDL) dùng LINQ, cũng như cập nhật/thêm/xóa dữ liệu từ đó.

LINQ to SQL hỗ trợ đầy đủ transaction, view và các stored procedure (SP). Nó cũng cung cấp một cách dễ dàng để thêm khả năng kiểm tra tính hợp lệ của dữ liệu và các quy tắc vào trong mô hình dữ liệu của bạn.

Giới thiệu về LINQ
LINQ là viết tắt của từ Language – Integrated Query tạm dịch là ngôn ngữ tích hợp truy vấn là một sự đổi mới trong Visual Studio 2008 và .NET Framework 3.5 là cầu nối khoảng cách giữa thế giới của các đối tượng với thế giới của dữ liệu. Theo truyền thống các câu truy vấn trên dữ liệu được thể hiện một cách dễ dàng giống như các chuỗi kí tự đơn giản mà không cần đến kiểu kiểm tra tại thời điểm biên dịch hoặc sự hỗ trợ của trình hỗ trợ trực quan. Hơn nữa bạn cần phải tìm hiểu một ngôn ngữ truy vấn khác nhau cho mỗi loại dữ liệu liệu nguồn khác nhau như: Cở sở dữ liệu SQL, tài liệu XML, các dịch vụ Web. LINQ làm cho một truy vấn một lớp đầu tiên xây dựng trong ngôn ngữ C# và Visual Basic. Bạn viết một câu truy vấn dựa trên tập hợp các đối tượng bằng cách sử dụng ngôn ngữ, các từ khóa các toán tử quen thuộc. Ví dụ minh họa sau đây cho thấy một phần câu truy vấn được hoàn thành dựa trên cơ sở dữ liệu SQL Server trong C# với đầy đủ loại kiểm tra và sự hỗ trợ của trình hỗ trợ trực quan.


Trong Visual Studio 2008 bạn có thể viết các câu truy vấn LINQ trong Visual Basic hoặc C# với cơ sở dữ liệu SQL Server, các tài liệu XML, ADO.NET Datasets và bất kỳ tập đối tượng được hỗ trợ IEnumerable hoặc có đặc điểm chung giống giao diện IEnumerable. LINQ hỗ trợ cho các thực thể ADO.NET Framework và LINQ đang được các nhà cung cấp hiện nay viết bởi bên thứ ba cho nhiều dịch vụ Web và các triển khai dữ liệu khác. Bạn có thể sử dụng các truy vấn LINQ trong các dự án mới hoặc trong các dự án hiện có. Một yêu cầu duy nhất là các dự án đó được xây dựng trên .NET Framework 3.5.

Giới thiệu về các truy vấn LINQ
Trong ví dụ trước vì dữ liệu là một mảng, nó hoàn toàn hỗ trợ đặc điểm chung giao diện IEnumerable . Điều này có nghĩa thực tế nó có thể được truy vấn với LINQ. Một truy vấn được thực hiện trong một câu lệnh foreach và foreach yêu cầu IEnumerable hay IEnumerable(T). Loại có hỗ trợ IEnumerable(T) hoặc một giao diện như IQueryable(T) được gọi là các loại queryable. Một loại queryable không yêu cầu phải sửa đổi hay xử lý đặc biệt để phục vụ một LINQ nguồn dữ liệu. Nếu các nguồn dữ liệu không phải là đã có trong bộ nhớ như là một loại queryable, một nhà cung cấp LINQ phải đại diện cho nó như vậy. Ví dụ, LINQ to XML một tài liệu XML vào một queryable XElement:Một câu truy vấn là một biêu thức gọi ra dữ liệu từ dữ liệu nguồn. Câu truy vấn thường nói rõ trong ngôn ngữ truy vấn đữ được thiết kế cho mục dích riêng. Các ngôn ngữ khác nhau đã được phát triển theo thời gian cho các loại dữ liệu ngồn, ví dụ như SQL dành cho cơ sở dữ liệu quan hệ và XQuery dành cho XML. Vì vậy các nhà phát triển đã tìm hiểu một ngôn ngữ truy vấn mới cho các loại dữ liệu nguồn hoặc các định dạng mà họ phải hỗ trợ. LINQ đơn giản tình trạng này bằng cách cung cấp một mô hình nhất quán để làm việc với các loại dữ liệu nguồn khác nhau và các định dạng. Trong một truy vấn LINQ bạn phải luôn luôn làm việc với các đối tượng. Bạn sử dụng giống như truy vấn mẫu cơ bản mã hóa và chuyển đổi dữ liệu trong các tài liệu XML, cơ sở dữ liệu SQL, ADO.NET DataSet và cho bất kì một định đạng nào mà một nhà cung cấp LINQ có sẵn.

1. Ba phần của một biểu thức LINQ.
Tất cả các biểu thức LINQ làm việc theo ba thao tác.
1. Có được các dữ liệu nguồn.
2. Tạo các truy vấn.
3. Thực hiện các truy vấn.
Ví dụ trong mã nguồn sau đây cho thấy ba phần của một truy vấn hoạt động như thế nào. Ví dụ sử dụng một mảng số nguyên như là một sự thay thế cho nguồn dữ liệu; tuy nhiên, trong cùng một khái niệm áp dụng cho các nguồn dữ liệu khác cũng có.
Ví dụ này sẽ được giới thiệu đến trong suốt phần còn lại của chủ đề này.

class IntroToLINQ
{
static void Main()
{
// The Three Parts of a LINQ Query:
// 1. Data source.
int[] numbers = new int[7] { 0, 1, 2, 3, 4, 5, 6 };
// 2. Query creation.
// numQuery is an IEnumerable
var numQuery = from num in numbers
where (num % 2) == 0
select num;

// 3. Query execution.
foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}
}

Minh họa sau đây cho thấy các hoạt động truy vấn tìm kiếm được hoàn tất. Trong LINQ việc thực hiện các truy vấn riêng biệt từ bản thân câu truy vấn. Nói cách khác bạn không lấy ra bất kỳ dữ liệu nào bằng cách tạo ra một biến truy vấn.

2. Các nguồn dữ liệu.
Trong ví dụ trước vì dữ liệu là một mảng, nó hoàn toàn hỗ trợ đặc điểm chung giao diện IEnumerable . Điều này có nghĩa thực tế nó có thể được truy vấn với LINQ. Một truy vấn được thực hiện trong một câu lệnh foreach và foreach yêu cầu IEnumerable hay IEnumerable(T). Loại có hỗ trợ IEnumerable(T) hoặc một giao diện như IQueryable(T) được gọi là các loại queryable. Một loại queryable không yêu cầu phải sửa đổi hay xử lý đặc biệt để phục vụ một LINQ nguồn dữ liệu. Nếu các nguồn dữ liệu không phải là đã có trong bộ nhớ như là một loại queryable, một nhà cung cấp LINQ phải đại diện cho nó như vậy. Ví dụ, LINQ to XML một tài liệu XML vào một queryable XElement:

foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}

Với LINQ to SQL trước tiên bạn tạo một đối tượng quan hệ được ánh xạ vào lúc thiết kế cái này được làm thủ công hoặc bằng cách sử dụng trình thiết kế đối tượng quan hệ (O/R Designer). Bạn viết các câu truy vấn của bạn dựa trên đối tượng và thi hành LINQ to SQL để xử lý các giao tiếp với cơ sở dữ liệu. Trong ví dụ sau, Customer đại diện cho một bảng trong cơ sở dữ liệu, và Table hỗ trợ các đặc tính chung IQueryable mà được bắt đầu từ IEnumerable.

// Create a data source from a SQL Server database.
// using System.Data.Linq;
DataContext db = new DataContext(@"c:\northwind\northwnd.mdf");

3. Truy vấn.
Truy vấn trong ví dụ trước trả về tất cả các số từ mảng số nguyên. Các biểu thức truy vấn chứa ba mệnh đề: from, where, select. (Nếu bạn đang quen với SQL sắp đặt của các mệnh đề là sai vị trí trong SQL). Mệnh đề from dùng để xác định nguồn dữ liệu, mệnh đề where dùng để lọc dữ liệu, mệnh đề select dùng để chọn ra những phần tử được trả về. các mệnh đề này và các mệnh đề truy vấn khác sẽ được thảo luận chi tiết trong phần LINQ Query Expresstions(Hướng dẫn lập trình C#). Lúc này một điểm quan trọng là trong LINQ, các biến truy vấn tựu nó không
hành động và trả về không có dữ liệu. Nó chỉ chứa đựng thông tin đó là yêu cầu từ kết quả trả về khi câu truy vấn được thực hiện tại một số điểm sau.

3.1 Thực thi truy vấn:
Hoãn thực thi:
Cũng giống như trạng thái trước đây, biến truy vấn tự nó chỉ chứa các lệnh truy vấn. Hiện nay sự thực thi của các truy vấn là hoãn lại đến tận khi bạn nhắc lại đối với biến truy vấn trong câu lệnh foreach. Cái này làm cơ sở để quy cho hoãn thực thi và là cái điển hình trong ví dụ sau:

foreach (int num in numQuery)
{
Console.Write("{0,1} ", num);
}

Câu lệnh foreach là nơi các kết quả truy vấn được trả về ví dụ các truy vấn trước đó biến num được lặp và nắm dữ mỗi giá trị trong trình tự trả về. Bởi các biến truy vấn tự nó không bao giờ chứa kết quả truy vấn, bạn có thể thực hiện nó thường xuyên như bạn muốn. Ví dụ bạn đang có một cơ sở dữ liệu mà đang được cập nhập liên tục bởi một ứng dụng riêng biệt. Trong ứng dụng của bạn, bạn có thể tạo một truy vấn để lấy ra dữ liệu mới nhất và bạn có thể thi hành nó một cách liên tục tại một khoảng thời gian để lấy kết quả mỗi lần.

3.2 Thực thi bắt buộc tức thời:

Truy vấn mà sự kết hợp thực hiện các chức năng trên một loạt các phần tử nguồn đầu tiên phải lặp đi lặp lại trên những nhần tử. Ví dụ như các truy vấn Count, Max, Average, và First. Những thực thi mà không có một câu lệnh foreach nào rõ ràng bởi vì các truy vấn tự nó phải sử dụng foreach để trả về là một kết quả. Cũng lưu ý rằng các loại truy vấn trả lại một giá trị, không phải là một tập IEnumerable. Các truy vấn sau đây sẽ trả về một số lượng các số trong mảng nguồn:

var evenNumQuery = from num in numbers where (num % 2) == 0 select num;

int evenNumCount = evenNumQuery.Count();
List numQuery2 = (from num in numbers
where (num % 2) == 0
select num).ToList();
// or like this:
// numQuery3 is still an int[]
var numQuery3 = (from num in numbers
where (num % 2) == 0
select num).ToArray();


Tổng quan về thiết kế Object Relational (O R)
Thiết kế đối tượng quan hệ (O / R Designer) cung cấp một hình ảnh thiết kế trực quan cho việc tạo LINQ to SQL để tổ chức các thực thể và sự kết hợp (các mối quan hệ) dựa trên các đối tượng trong một cơ sở dữ liệu. Nói cách khác, các O / R được thiết kế sử dụng để tạo ra một mô hình đối tượng trong một ứng dụng để ánh xạ các đối tượng trong một cơ sở dữ liệu. Nó cũng tạo ra một mạnh kiểu rõ ràng DataContext được sử dụng để gửi và nhận dữ liệu giữa các lớp thực thể và cơ sở dữ liệu. O / R Designer cũng cung cấp tính năng cho việc ánh xạ các thủ tục lưu trữ và các hàm để thục hiện các phương thức trong DataContext trả về các dữ liệu và populating tổ chức các lớp thực thể. Cuối cùng, O / R Designer cung cấp khả năng thiết kế thừa kế các mối quan hệ giữa các lớp thực thể.

O / R Designer tạo ra những file có phần mở rông là .dbml cung cấp cho việc ánh xạ giữa các lớp LINQ to SQL và các đối tượng dữ liệu. O / R Designer cũng tạo ra những kiểu DataContext và tổ chức các lớp thực thể.

O / R Designer có hai khu vực riêng biệt trên bề mặt thiết kế: các thực thể trong của sổ bên trái, và các phương thức trong cửa sổ bên phải. Cửa sổ các thực thể chính là bề mặt thiết kế lớp thực thể, các sự kết hợp, và các bậc kế thừa. Các phương thức trong của sổ bên phảilà bề mặt thiết kế có hiển thị DataContext các phương thức ánh xạ để lưu trữ các thủ tục và hàm.

1. Mở các O / R Designer
Bạn có thể mở các O / R bằng cách thêm một class mới vào dự án O / R Designer là một cách dễ dàng đẻ ánh xạ các đối tượng bởi vì nó chỉ hỗ trợ ánh xạ 1:1các mối quan hệ. Nói cách khác, một lớp thực thể có thể chỉ có một ánh xạ 1:1trong mối quan hệ với một cơ sở dữ liệu hoặc view. Ánh xạ phức tạp, chẳng hạn như ánh xạ một lớp thực thể tham gia vào một bảng, hiện chưa hỗ trợ. Ngoài ra, các nhà thiết kế là một sinh mã tự động một chiều. Điều này có nghĩa là chỉ thay đổi mà bạn thực hiện để các nhà thiết kế bề mặt được phản ánh trong các tập tin code. Hướng dẫn để thay đổi các tập tin code không được phản ánh trong O / R Designer. Bất kỳ thay đổi nào mà bạn làm thủ công trong các tập tin mã được ghi đè khi thiết kế được lưu và code là tự phục hồi.

2. Cấu hình và tạo ra DataContext
Sau khi bạn thêm một lớp LINQ cho SQL cho một mục dự án và mở O / R Designer thiết kế, các thiết kế bề mặt trống rỗng đại diện một DataContext sẵn sàng để được cấu hình. các DataContext được cấu hình kết nối với các thông tin được cung cấp bởi các phần tử đầu tiên được kéo vào cho việc thiết kế .. Vì vậy, các DataContext được cấu hình bằng cách sử dụng kết nối thông tin từ các phần tử dầu tiên được kéo vào thiết kế bề mặt thiết kế.

3. Tạo tổ chức các lớp mà cơ sở dữ liệu bản đồ để bàn và xem
Bạn có thể tạo các lớp thực thể được ánh xạ từ các bảng và các view bằng cách kéo thả các cơ sở dữ liệu và các view Server Explorer / Explorer Database lên các O / R Designer. Như chỉ định trong phần trước của DataContext được cấu hình kết nối với các thông tin được cung cấp bởi các phần tử đầu tiên được kéo thả vào bề mặt thiết kế. Nếu một mục sau mà sử dụng một kết nối khác sẽ được thêm vào O / R Designer, bạn có thể thay đổi kết nối cho các DataContext.

4. DataContext tạo ra phương pháp gọi thủ tục lưu trữ và các hàm
Bạn có thể tạo DataContext chưa các phương thức mà gọi (được ánh xạ tới) các thủ tục và các hàm lưu trữ bằng cách kéo chúng từ Server Explorer / Explorer Database lên các O / R Designer. Các thủ tục lưu trữ và các hàm được đưa vào các O / R Designer như phương thức của DataContext.

5. Cấu hình một DataContext để sử dụng các thủ tục lưu trữ dữ liệu lưu dữ liệu giữa các lớp thực thể và cơ sở dữ liệu
Như đã nêu trên, bạn có thể tạo DataContext chứa các phương thức gọi các thủ tục lưu trữ và các hàm. Ngoài ra, bạn cũng có thể chỉ định các thủ tục lưu trữ được sử dụng mặc định cho LINQ to SQL để thực hiện hành động insert, update, và delete.

6. Thừa kế và các O / R Designer
Giống như các đối tượng khác, các lớp LINQ to SQL có thể sử dụng được kế thừa và thu được từ các lớp. Trong một cơ sở dữ liệu, các mối quan hệ thừa kế được tạo ra trong một số cách. O / R Designer hỗ trợ các khái niệm về đơn-bảng kế thừa như nó thường triển khai thực hiện trong các hệ thống.

DangTrung.

Thứ Sáu, 22 tháng 2, 2008

10 điều bạn nên biết về Silverlight

Một số người cho rằng Microsoft muốn phát hành sản phẩm này nhằm đánh bại đối thủ Flash của Adobe. Đến thời điểm này thì câu trả lời vẫn chưa ngã ngũ và có lẽ cần phải có thêm thời gian nữa để người dùng chấp nhận lựa chọn sản phẩm nào thú vị hơn. Chúng tôi cũng không thực sự thiên vị về một sản phẩm nào, song thẳng thắn mà nói thì Silverlight của Microsoft cũng có một số ưu điểm sẽ được chúng tôi liệt kê dưới đây:

1. Silverlight tránh được các vấn đề về hệ điều hành cũng như trình duyệt

Với hầu hết các nhóm phát triển phần mềm, việc phát triển một website làm việc trên các trình duyệt phổ biến khác nhau như Internet Explorer, Firefox, Safari và Opera quả là một điều khó khăn. Vấn đề ở đây không đơn giản ở việc cần thiết có sự bổ sung mã mà còn cả một số lượng lớn các công việc kiểm thử. Khi một nhà phát triển phần mềm tạo càng nhiều phiên bản trình duyệt và hệ điều hành, số lượng công việc test thử sẽ càng trở nên khổng lồ.

Thông thường có hai cách mà một dự án phát triển vẫn nhắm đến đó là: hỗ trợ một tập nhỏ các trình duyệt Web hoặc tăng số lượng nhân viên để đảm về chất lượng.

Tương phản với điều đó, Silverlight plug-in cho phép có được mô hình phát triển như nhau mà không cần quan tâm tới hệ điều hành và trình duyệt của người dùng là gì. Hiện nay, hai hệ điều hành và ba trình duyệt đã đang được hỗ trợ. Microsoft hứa sẽ bổ sung thêm sự hỗ trợ cho trình duyệt Opera trên hệ điều hành Windows và Mac. Thêm vào đó là dự án Mono tạo một bước tiến dài trong dự án Moonlight của nó, dự án này thiên về việc đưa Silverlight vào Linux.

2. Silverlight, câu chuyện có thật

Ngay từ phiên bản đầu là Release Candidate, Silverlight đã được nhiều tổ chức xem xét và cân nhắc. Quả thực nó có nhiều tính năng quan trọng và thú vị, nhận được rất nhiều sự đồng tình ủng hộ trong phát hành này.

Phát hành Silverlight 1.1 lần đầu tiên có hỗ trợ .Net, gồm có các ngôn ngữ .Net cơ bản, C# và Visual Basic. Thêm vào đó theo Microsoft, Silverlight 1.1 sẽ có sự hỗ trợ .Net cho các ngôn ngữ động như Ruby, Python, dynamic Visual Basic và Jscript đã có. Theo quan điểm của chúng tôi, các ngôn ngữ quan trọng để Silverlight hỗ trợ là C# và Visual Basic vì chúng cho phép các chuyên gia phát triển .Net có thể tạo các ứng dụng Silverlight. Trong phiên bản 1.1, bất kỳ ngôn ngữ .Net nào cũng phải được hỗ trợ, vì những gì thực sự được cung cấp cho trình duyệt đều là các thành phần .Net lắp ráp.

3. Silverlight sử dụng công nghệ quen thuộc với các chuyên gia phát triển

Silverlight được xây dựng với các công nghệ của Microsoft đang tồn tại: sự trộn lẫn giữa Windows Presentation Framework-như XAML (ngôn ngữ markup ứng dụng XML), JavaScript và các công nghệ .Net. Nếu các chuyên gia phát triển của bạn đã thân thiện với các công nghệ Web và Microsoft .Net thì họ hoàn toàn có thể sử dụng các kiến thức đã có để xây dựng ứng dụng Silverlight.

Phiên bản Silverlight bạn chọn để giới thiệu cho một dự án mới sẽ phụ thuộc vào các kỹ năng mà nhóm phát triển có. Nếu nhóm phát triển phần mềm nặng về phát triển ASP.NET trình chủ (chủ yếu là C# và VB.Net) thì bạn cần phải dùng Silverlight 1.1, còn nếu họ tinh thông về các ngôn ngữ trình khách như JavaScript, thì Silverlight 1.0 là nền tảng tuyệt vời để giới thiệu.

4. Giao diện người dùng của Silverlight cũng là Markup – giống HTML

XAML là một ngôn ngữ của Silverlight cho thiết kế giao diện người dùng. Bạn có thể đã quen với ngôn ngữ markup phổ biến khác như HTML. HTML là các văn bản thô gồm có các thông tin trình báo với trình duyệt Web về cách render “look” và “feel” của trang web. XAML cũng thực hiện các công việc tương tự. Tuy vậy thay vì trình duyệt thông dịch các chỉ lệnh về cách render file như thế nào thì runtime của Silverlight lại thực hiện việc render.

Tồn tại markup XAML là điều quan trọng vì nó có thể được tạo một cách tự động. Dù các chuyên gia phát triển của bạn sử dụng bất cứ công cụ nào để phát triển Web trình chủ thì cũng đều có thể tạo một HTML động cho các trang web. Kỹ thuật này quá hấp dẫn vì bạn có thể tạo các đoạn HTML có khả năng dùng lại để sử dụng trên chính site của bạn. Một ví dụ cho vấn đề này là thiết kế một trang chủ của các websie. Thông thường, phần header và footer (và cả phần bên phải và trái của trang) đều có thể được sử dụng lại trong toàn bộ trang web.

Vì XAML cũng là markup nên bạn có thể sử dụng các công nghệ trình khách để tạo động XAML giống như những gì mà các chuyên gia phát triển đã thực hiện với HTML. Ngôn ngữ markup tuy có phần khác nhưng các công nghệ lại hoàn toàn giống nhau.

5. Silverlight và công nghệ AJAX có thể bổ sung cho nhau

Web vẫn đang trong quá trình phát triển. Những ngày ban đầu khi mới xuất hiện web, thời điểm những năm 1990, bất kỳ ai cũng đều muốn rằng các chuyên gia phát triển nên chuyển nhiều thứ vào máy chủ để ứng dụng trở lên linh hoạt hơn. Trong khi vấn đề này đang được thực hiện tốt về mặt kỹ thuật thì nó đã cản trở những cảm nhận từ phía người dùng. Hiện giờ Asynchronous JavaScript and XML là tất cả những gì còn lại. Đơn giản AJAX viết mã một cách trực tiếp trong trình duyệt để cho phép sự tương tác với người dùng tốt hơn. Ví dụ kinh điển trong trường hợp này là Google maps (hoặc Live maps của Microsoft).

Silverlight đi theo mô hình này bằng cách cho phép nhiều giao diện người dùng ấn tượng hơn trong trình duyệt. Việc trao đổi dữ liệu giữa máy chủ và máy khách bằng sử dụng các công nghệ AJAX (dù thư viện AJAX nào đi chăng nữa) cho phép các ứng dụng Silverlight có nhiều sức mạnh. Sử dụng mô hình giao diện người dùng phong phú của Silverlight cùng với mô hình truyền tải dữ liệu mạnh của AJAX, bạn sẽ có được khả năng tương tác đến bất ngờ mà không cần ép buộc người dùng đợi cho đến khi trang web được refresh.

7. Silverlight cho phép các chuyên gia phát triển và các nhà thiết kế có thể làm việc cùng nhau

Web đã bắt buộc các nhóm phát triển phải nghĩ nhiều hơn về vấn đề thiết kế và mỹ học. Cảm nhận người dùng được thuận lợi và các giao diện có tính trực giác trở thành tiêu chuẩn đặc biệt. Điều này thường xảy ra bởi việc đòi hỏi phải đẹp và có các kỹ năng cho cảm nhận của người dùng trong phát triển ứng dụng. Ngày nay, điều đó được thực hiện bằng cách sử dụng các họa sỹ thiết kế để thiết kế cho một website.

Mặc dù vậy, các thành phần mà các nhà họa sỹ sử dụng và cung cấp thường khá khác nhau (tùy công cụ mà các chuyên gia phát triển sử dụng). Điển hình, các họa sỹ thiết kế cung cấp các file ảnh (như Photoshop hoặc các file .jpg) hoặc (trong một số trường hợp tiên tiến hơn) HTML đóng vai trò khung cho các chuyên gia phát triển phần mềm tích hợp chúng vào trong một dự án. Dù bạn sử dụng công nghệ nào đi chăng nữa thì các thiết kế đó cũng vẫn phải được tích hợp vào mã ứng dụng web. Khi việc thiết kế tiếp tục, sự tích hợp này được diễn ra một cách thường nhật. Về vấn đề này Silverlight đã đưa ra một diện mạo phát triển tốt hơn. Tập công cụ của Microsoft cho Silverlight là sự trộn lẫn của các công cụ phát triển truyền thống, như Visual Studio và các công cụ mới được đưa ra cho các nhà thiết kế như Expression Studio.

Với Silverlight, công cụ thiết kế chính là Expression Blend, công cụ này cho phép tạo XAML theo cách thích hợp và thân thiện với các nhà thiết kế. Sử dụng Blend cũng giống như Adobe Illustrator hoặc Photoshop. Sự khác biệt lớn nhất ở đây là nó sử dụng cùng công cụ mà các nhà phát triển sử dụng. Blend làm việc cùng với các file dự án, các file XAML và JavaScript cũng như Visual Studio. Khi một thiết kế được tạo và tinh chỉnh, không cần đến bước tích hợp để sử dụng nó trong Silverlight. Các nhà thiết kế có thể xem sự tương tác thiết kế của mình với cùng logic mà các chuyên gia phát triển đưa vào trong một dự án lớn. Cách thực hiện như vậy giúp các nhà thiết kế cũng như chuyên gia phát triển có thể làm việc cùng nhau tốt hơn.

7. Khả năng phân phối Silverlight

Silverlight được phân phối đến một trình duyệt web trong các mẩu chương trình nhỏ. Điều này có nghĩa là trong một hoặc nhiều gói (các file JavaScript, assemblies,…), thiết kế được cung cấp bằng một hoặc một vài gói (như các file XAML) và các tài nguyên khác được cung cấp một cách độc lập (ảnh, phông chữ và video). Các chuyên gia phát triển Silverlight thời gian đầu, những người đã quen thuộc với khả năng phân phối của một file Flash chưa thích vấn đề này.

Tuy vậy trong thực tế lại hoàn toàn khác. Các gói tách biệt lại khuyến khích sự sáng tạo trong nội dung động phía trình chủ dễ dàng hơn những gì đã được thực hiện trong Flash ngày nay. Nó cho phép chúng ta có thể tạo XAML hấp dẫn và động trên máy chủ, phân phối nó một cách đơn giản theo cách mà chúng ta thực hiện với markup (ví dụ như HTML). Silverlight có một điều kiện thuận lợi cho việc sử dụng các file Zip để đóng gói nhiều file được sử dụng bởi mã XAML (ảnh, video, phông chữ, các file kịch bản…) và download chúng hiệu quả đến máy khách.

8. Điểm mới trong Silverlight

Silverlight thực sự là những cố gắng của Microsoft trong công nghệ này. Quả thực đây là một công nghệ chưa thực sự chín muồi với những sản phẩm hiện đang được cung cấp của các công ty khác như Flash và Flex của Adobe. Flash hiện đang có phiên bản 9.0 và sản phẩm này đã có một lịch sử phát triển khá lâu, luôn dẫn đầu về cả tính phổ biến và sự phong phú. Tuy nhiên điều đó không có nghĩa rằng Silverlight sẽ không thể bắt kịp Flash trong cuộc chạy đua này. Microsoft có một sở trường riêng cho việc học từ những thất bại và thành công của người đi trước (hãy xem Java và .NET). Tuy nhiên mọi vấn đề đều chưa thể chắc chắn ngay từ bây giờ được.

Nếu bạn lên kế hoạch tạo các ứng dụng thay thế chính cho các ứng dụng máy trạm làm việc để kiểm soát dữ liệu thì có thể thiếu mất các điều khiển cơ bản và việc kết nối dữ liệu trong Silverlight. Silverlight không phải là một sự thay thế cho các biểu mẫu của Windows Forms, Windows Presentation Foundation (WPF), Java Applets hoặc Sharepoint. Đơn giản là nó được thiết kế để thực hiện nhiệm vụ của các ứng dụng dòng doanh nghiệp. Tuy nhiên nếu bạn muốn tạo các ứng dụng phong phú hoạt động được trên nhiều nền tảng và hệ điều hành thì Silverlight chính là thứ phù hợp.

9. Silverlight XAML với WPF XAML

XAML có thể nói như một ưu điểm tuyệt vời vì WPF của Microsoft cũng sử dụng XAML. Tuy nhiên không may ở đây là các ưu điểm này không hấp dẫn như những gì nó có vẫn được nghĩ vì sự chấp thuận WPF vẫn ở con số thấp và các điểm khác nhau giữa WPF XAML và Silverlight XAML.

Trước tiên những nhân chứng cho thấy rằng sự tỉ lệ chấp thuận WPF vẫn tương đối thấp trong so sánh với các công nghệ trình khách khác như Visual Basic 6 và Windows Forms của .Net. Chính vì vậy sự thật XAML vẫn chưa thực sự mạnh trong một vài năm vừa qua.

Thứ hai, Silverlight XAML là một văn phạm đã được đơn giản hóa so với WPF XAML, chính vì vậy Silverlight XAML không có nhiều sức mạnh. Điều này tốt và cũng không tốt. Silverlight XAML thực sự rất dễ hiểu nhưng nếu các chuyên gia phát triển vẫn so sánh với Silverlight từ WPF, thì nó dường như là không đủ.

Với quan điểm của chúng tôi, văn phạm nhỏ hơn sẽ tốt hơn cho Silverlight, vì runtime là nó và có khả năng quản lý người dùng. Silverlight XAML không có những thứ gì không cần thiết cho nhiệm vụ thủ công. Rõ ràng nó sẽ có lợi trong việc xây dựng nhiều chức năng trong Silverlight XAML, nhưng phương pháp hiện hành khá cẩn thận về lượng được bổ sung để giữ giao diện lập trình ứng dụng nhỏ và nhẹ.

10. Silverlight cách tuyệt vời để học XAML

Như được nhìn nhận từ phần trên, XAML của Silverlight có một văn phạm tương đối nhỏ. Điều này có nghĩa nó chính là cách tốt để học XAML làm việc như thế nào. Các chuyên gia phát triển phần mềm đang muốn học XAML và muốn theo kịp với tốc độ của công nghệ sẽ hiểu rõ giá trị của Silverlight với cách tạo mã sáng sủa và ngắn gọn của nó. Hầu hết các chuyên gia phát triển đều sẽ sớm nghĩ về các tính năng mà họ sẽ thích trong Silverlight. Khi bắt đầu xem xét XAML của WPF họ sẽ thấy được hầu hết các tính năng đó đều có trong Silverlight,

Ngược lại các chuyên gia bắt đầu với WPF và chọn Silverlight sẽ cần từ bỏ một số phương tiện dự trữ trong chuẩn bị của họ.

Lúc này chính là thời điểm để xác định xem sử dụng Silverlight trong chiến lược Web của bạn là đúng hay không. Silverlight là một công nghệ thú vị mà có lợi ích nhiều với công ty của bạn cũng như các khách hàng và người dùng. Chúng tôi hy vọng bài này có thể giúp được bạn có được tầm hiểu biết sâu hơn về các tài liệu thị trường và hiểu được những giá trị thực cũng như hạn chế của công nghệ. 

DangTrung.