2010-02-25 42 views
9

tôi hơi bối rối về phương pháp tĩnh trong trang asp.net. Ví dụ. nếu tôi tạo ra một cơ sở dữ liệu tĩnh-phương pháp để có được Userdata ra khỏi cơ sở dữ liệu (một cái gì đó giống như UserDBHandler.getUser()) - là nó an toàn để gọi phương thức đó từ bên trong các trang web? Không phải là một chuỗi mới được tạo cho mỗi lần gọi trang? Và không HttpContext.Current luôn luôn trả về bối cảnh hiện tại-người dùng, vì vậy nó là an toàn để gọi đó từ phương pháp tĩnh để có được phiên người dùng hiện tại ??Phương pháp tĩnh trong ASP.NET

nhờ

Trả lời

0

Trong phạm vi của một phiên duy nhất tôi tin rằng bạn sẽ được chạy trên một chủ đề duy nhất vì vậy đây không phải là một vấn đề.

8

là nó an toàn để gọi là phương pháp từ trong web trang

Chỉ khi phương pháp này là reentrant. Ví dụ với sql:

public static User GetUser(string username) 
{ 
    using (var connection = new SqlConnection(ConnectionString)) 
    using (var command = connection.CreateCommand()) 
    { 
     connection.Open(); 
     command.CommandText = "select name, username from users where username = @username"; 
     command.Parameters.AddWithValue("@username", username); 
     using (var reader = command.ExecuteReader()) 
     { 
      while (reader.Read()) 
      { 
       return new User 
       { 
        Username = username, 
        Name = reader.GetString(0), 
       } 
      } 
     } 
     return null; 
    } 
} 

Và gọi trong trang ASPX của bạn:

var user = SomeClass.GetUser(Session["username"]); 

Và không HttpContext.Current luôn trở lại bối cảnh hiện nay người tiêu dùng, vì vậy là nó an toàn để gọi đó là từ static phương pháp để có được người dùng hiện tại phiên?

Có, HttpContext.Current có thể được sử dụng một cách an toàn để tải ngữ cảnh HTTP hiện tại. Nhưng tôi sẽ đề nghị bạn không gọi HttpContext.Current trong phương pháp truy cập DB của bạn. Chỉ cần vượt qua những gì cần thiết như là đối số để trang ASPX của bạn khi gọi phương thức sẽ đọc một cách an toàn phiên và vượt qua các tham số cần thiết.

Ghi chú và tư vấn cá nhân: không sử dụng các phương pháp tĩnh để truy cập dữ liệu. Mã gọi bằng phương pháp tĩnh gần như không thể kiểm tra đơn vị.

+0

Cảm ơn câu trả lời của bạn! Vậy GetUser-Method của bạn có an toàn cho chủ đề không? Một câu hỏi khác: Kết nối được đóng ngay cả khi có sự trở lại trong khối sử dụng? –

+0

Không, kết nối không được đóng. Nó được trả về hồ bơi kết nối ADO.NET để tái sử dụng. –

0

Tùy thuộc vào cách thức viết. Nếu phương pháp được viết theo một cách an toàn, thì bạn sẽ không gặp vấn đề gì.

2

là nó an toàn để gọi là phương pháp từ trong web trang

Đó thực sự phụ thuộc vào những gì bạn làm trong phương pháp này. Phương pháp này có lẽ là một hàm không có tác dụng phụ.

Isnt a thread mới được tạo ra cho mỗi trang gọi

Yes.

does HttpContext.Current always return the current-users context, so is it safe to call that from static methods to get the current-users session?? 

Có.

Nếu bạn muốn là người thuần túy, bạn không nên dựa vào các phương pháp tĩnh vì chúng làm cho mã của bạn khó kiểm tra trong sự cô lập. Nếu lớp A gọi phương thức tĩnh trên lớp B, bạn sẽ không bao giờ có thể kiểm tra lớp A mà không cần kiểm tra/gọi B.

Các vấn đề liên quan