2010-05-02 36 views
11

Tôi có ứng dụng web ASP.NET MVC triển khai nhà cung cấp tư cách thành viên tùy chỉnh. Nhà cung cấp tư cách thành viên tùy chỉnh lấy một số UserRepository cho hàm tạo của nó cung cấp giao diện giữa nhà cung cấp thành viên và NHibernate. Các UserRepository được cung cấp bởi container Ninject IoC. Rõ ràng, tuy nhiên, điều này không hoạt động khi nhà cung cấp được khởi tạo bởi .NET: constructor không có tham số không có UserRepository và không thể tạo một UserRepository yêu cầu một phiên NHibernate được truyền cho constructor của nó), sau đó có nghĩa là nhà cung cấp không thể truy cập kho dữ liệu của nó. Làm thế nào tôi có thể giải quyết sự phụ thuộc đối tượng của tôi?Tiêm phụ thuộc với Nhà cung cấp tư cách thành viên tùy chỉnh

Có thể đáng lưu ý rằng đây là một ứng dụng hiện có đã được trang bị thêm với Ninject. Trước đây tôi đã sử dụng các hàm tạo tham số có thể tạo ra các phụ thuộc bắt buộc của chúng kết hợp với các hàm tạo tham số để hỗ trợ kiểm thử đơn vị.

Bất kỳ suy nghĩ nào, hoặc tôi đã xây dựng bản thân mình thành một góc ở đây?

Trả lời

5

Bạn có thể muốn giữ hàm tạo không tham số, khởi tạo các kho lưu trữ cần thiết bằng cách sử dụng Ninject. Bạn có thể muốn sử dụng Common Service Locator, vì vậy bạn sẽ không cần phải có tham chiếu đến Ninject hay thùng chứa của nó bên trong nhà cung cấp tùy chỉnh của bạn. Có vẻ như Ninject không có một trình cài đặt adapter chính thức cho CSL, nhưng việc viết một cái không nên khó (kiểm tra các triển khai khác, như của Windsor), và tôi chắc chắn có một sự thực thi không chính thức ở đâu đó.

+3

Ninject đã có bộ điều hợp CSL chính thức tháng 1 năm 2010. –

+0

Nó vẫn bị thiếu trong trang chủ CSL (nó được đưa vào bản phát hành NInject) – SztupY

+1

"hàm tạo, khởi tạo kho lưu trữ cần thiết bằng Ninject" - xem ra, nếu kho của bạn (hoặc phụ thuộc của chúng) nằm trong phạm vi Yêu cầu hoặc Phạm vi và bất kỳ loại bối cảnh dữ liệu dùng một lần xuất hiện, bạn sẽ kết thúc truy cập vào bối cảnh dữ liệu được xử lý trên tất cả trừ yêu cầu đầu tiên (vì bạn không kiểm soát thời gian của nhà cung cấp và ASP.NET sẽ sử dụng lại nó theo yêu cầu). Tôi đã kết thúc với nhận được một ví dụ kho lưu trữ từ định vị mỗi khi tôi cần thiết để gọi một khi tôi đi qua vấn đề này. –

-1

Tôi đã gặp sự cố tương tự, tôi đã giải quyết vấn đề bằng cách chuyển dữ liệu bắt buộc bằng vé xác thực cho đối tượng nhận dạng.

Sau đó, không có đối tượng nào cần được tiêm vào các nhà cung cấp thành viên.

Trong mã xác thực của tôi, tôi có

[NonAction] 
    private void SetAuthTicket(Member member, bool isPersistent) 
    { 
     HttpCookie cookie = Request.Cookies.Get(FormsAuthentication.FormsCookieName); 

     FormsAuthentication.SetAuthCookie(member.Email, isPersistent); 

     string userData = "|" + member.ID + "|" + member.Firstname + "|" + member.Lastname + member.Culture; 

     FormsAuthenticationTicket ticket = new FormsAuthenticationTicket(1, member.Email, DateTime.UtcNow, DateTime.UtcNow.AddDays(7), isPersistent, userData); 

     string encryptedTicket = FormsAuthentication.Encrypt(ticket); 
     cookie = new HttpCookie(FormsAuthentication.FormsCookieName, encryptedTicket); 
     Response.Cookies.Add(cookie); 
    } 

Và trong Global.asax

void Application_OnPostAuthenticateRequest(object sender, EventArgs e) 
    { 
     IPrincipal user = HttpContext.Current.User; 
     if (user.Identity.IsAuthenticated && user.Identity.AuthenticationType == "Forms") 
     { 
      FormsIdentity identity = user.Identity as FormsIdentity; 

      MyIdentity ai = new MyIdentity(identity.Ticket);    
      MyPrincipal p = new MyPrincipal(ai); 

      HttpContext.Current.User = p; 
      System.Threading.Thread.CurrentPrincipal = p; 

      if (!String.IsNullOrEmpty(ai.Culture)) 
      { 
       CultureInfo ci = new CultureInfo(ai.Culture); 
       System.Threading.Thread.CurrentThread.CurrentUICulture = ci; 
       System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(ci.Name); 
      } 
     } 
    } 

Và trong nhận dạng lớp I có đặc tính MemberName, firstname và lastname trả lại một phần của chuỗi vé.

+0

Xin bạn có thể đi vào một chi tiết ít hơn? Làm thế nào, ví dụ, hàm ghi đè CreateUser() trong kịch bản của bạn? Bạn có nói rằng trong kịch bản của tôi, tôi sẽ phải vượt qua đối tượng kho lưu trữ xung quanh trong vé xác thực? – alastairs

+0

Thay vì chuyển mã thông qua id người dùng –

+0

cái gì ?? Tôi đồng ý với @alastairs, làm cách nào để bạn tạo người dùng và các nội dung khác mà không có kho lưu trữ? – mare

4

Vì bộ sưu tập thành viên và cá thể MemberShip.Provider được tạo trước khi Ninject có thể khởi tạo chúng, bạn cần thực hiện kích hoạt tạo bài đăng trên đối tượng. Nếu bạn đánh dấu các phụ thuộc của bạn với [Tiêm] cho các thuộc tính của bạn trong lớp nhà cung cấp của bạn, bạn có thể gọi kernel.Inject (MemberShip.Provider) - điều này sẽ gán tất cả các phụ thuộc vào các thuộc tính của bạn.

câu trả lời
+0

Nghe hay; Tôi đã giải quyết nó với CSL, nhưng có thể đáng để ghé thăm để loại bỏ sự phụ thuộc thêm. – alastairs

+0

+1 Tôi thích phương pháp này. – Pandincus

+2

Bạn sẽ gọi hạt nhân ở đâu.Inject ...? – Matt

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