2010-04-14 29 views
5

Tôi đang tạo nhà cung cấp tư cách thành viên tùy chỉnh cho ứng dụng asp.net của mình. Tôi cũng đã tạo ra một lớp riêng biệt "DBConnect" cung cấp chức năng cơ sở dữ liệu như thực hiện câu lệnh SQL, thực thi SP, thực thi SP hoặc truy vấn và trả về SqlDataReader và ...Cung cấp chức năng cơ sở dữ liệu tùy chỉnh cho nhà cung cấp tư cách thành viên asp.net tùy chỉnh

Tôi đã tạo ra thể hiện của lớp DBConnect trong Session_Start của Global.asax và được lưu trữ trong một phiên. Sau đó sử dụng một lớp tĩnh Tôi đang cung cấp chức năng cơ sở dữ liệu trong suốt ứng dụng bằng cách sử dụng cùng một phiên. Trong ngắn hạn tôi đang cung cấp một điểm duy nhất cho tất cả các hoạt động cơ sở dữ liệu từ bất kỳ trang asp.net nào.

Tôi biết rằng tôi có thể viết mã của riêng mình để kết nối/ngắt kết nối cơ sở dữ liệu và thực thi SP trong các phương thức tôi cần ghi đè. Hãy nhìn vào đoạn code dưới đây -

public class SGI_MembershipProvider : MembershipProvider 
{ 

......

public override bool ChangePassword(string username, string oldPassword, string newPassword) 
    { 
     if (!ValidateUser(username, oldPassword)) 
      return false; 

     ValidatePasswordEventArgs args = new ValidatePasswordEventArgs(username, newPassword, true); 

     OnValidatingPassword(args); 

     if (args.Cancel) 
     { 
      if (args.FailureInformation != null) 
      { 
       throw args.FailureInformation; 
      } 
      else 
      { 
       throw new Exception("Change password canceled due to new password validation failure."); 
      } 
     } 

.....   

//Database connectivity and code execution to change password. 

} 

.... 

} 

vấn đề của tôi - Bây giờ những gì tôi cần là để thực hiện một phần cơ sở dữ liệu trong tất cả các phương pháp overriden từ cơ sở dữ liệu tương tự điểm như được mô tả ở trên cùng. Đó là tôi phải vượt qua thể hiện của DBConnect hiện có trong phiên này cho lớp này, để tôi có thể truy cập các phương thức.

Có ai có thể cung cấp giải pháp về vấn đề này không. Có thể có một số kỹ thuật tốt hơn tôi không biết điều đó. Cách tiếp cận tôi đang sử dụng có thể sai. Khen ngợi của bạn luôn được chào đón.

Cảm ơn bạn đã chia sẻ thời gian quý báu của mình.

Trả lời

4

Hiểu vòng đời của nhà cung cấp tư cách thành viên sẽ giúp làm rõ điều này.

Ví dụ về nhà cung cấp thành viên được tách ra khi ứng dụng được bắt đầu và vẫn hoạt động trong suốt thời gian của ứng dụng AppDomain, trong thực tế tương đương với vòng đời của ứng dụng. ví dụ. Nếu vì lý do nào đó, chu trình AppDomain, ứng dụng sẽ được xử lý và một cá thể mới được tách ra. Một trường hợp mới của nhà cung cấp thành viên đã đăng ký được quay lên lần đầu tiên sử dụng.

Bạn cần phải khởi tạo một lớp thể hiện của lớp truy cập dữ liệu của bạn trong phạm vi triển khai nhà cung cấp thành viên hoặc truy cập các phương pháp tĩnh từ trong vòng nhà cung cấp của bạn. Tôi thích sử dụng một thể hiện.

Tách nhà cung cấp tư cách thành viên khỏi truy cập dữ liệu bằng cách tạo ra đơn hoặc stashing nó trong ứng dụng là một hack theo ý kiến ​​của tôi và sẽ dẫn đến không có gì ngoài nỗi đau, nỗi buồn, mất ngủ và độ tin cậy giữa các đồng nghiệp của bạn.

Chúc mừng và chúc may mắn.

3

Không giữ phiên bản riêng biệt của lớp DBConnect trong phiên, bạn sẽ kết thúc việc tạo lớp cho từng người dùng! Điều này sẽ ảnh hưởng nghiêm trọng đến khả năng mở rộng.

Bạn có thể làm một trong các cách sau:

  • Đặt lớp trong trạng thái ứng dụng
  • Sử dụng singleton pattern
  • Tận dụng lớp và tất cả các phương thức trong lớp tĩnh.

Tôi đề nghị là để đi cho số 3. Bạn không thường cần phải tạo một thể hiện của một lớp học mà không hoạt động cơ sở dữ liệu crud ví dụ

public static class DBConnect 
{ 
    public static ChangePassword(string userId, string password) 
    { 
    //Implementation here 
    } 
} 

Sau đó, bạn chỉ có thể gọi mã này trong cung cấp dịch vụ của bạn mà không tạo một cá thể:

DBConnect.ChangePassword(x,y); 
+0

Cảm ơn James! Tôi đã không chính xác theo cùng một cách để hoạt động cơ sở dữ liệu. Nhưng thay vì ChangePassword() như một thành viên của DBConnect, tôi cần thực hiện một phần nhỏ như SqlParameter [] p = new SqlParameter [3]; p [0] = new SqlParameter ("@ applicationName", applicationName); p [1] = new SqlParameter ("@ username", tên người dùng); p [2] = new SqlParameter ("@ mật khẩu", EncodePassword (newPassword)); bool retval = dbConn.ExecuteSP ("User_ChangePassword", p); trong lớp My MembershipProvider của tôi. – IrfanRaza

+0

Mã đó phải đi trong kết nối db, các giá trị cho tham số sql phải được chuyển thành các tham số trên hàm tĩnh. Đừng lo lắng, mọi thứ sẽ chạy trong cùng một quá trình và các kết nối sẽ được gộp lại bởi ado.net. –

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