2012-05-04 36 views
8

Tôi đang xây dựng một ứng dụng MVC3 bằng cách sử dụng khung công tác Ninject. Tôi có một dịch vụ tốn nhiều thời gian để khởi tạo và cuối cùng dịch vụ này sẽ có một đối tượng chứa thông tin người dùng cụ thể, sau đó tôi cần phải sử dụng lại dịch vụ đó miễn là phiên người dùng đang hoạt động, để tôi có thể tránh để khởi tạo dịch vụ mà một lần nữa và một lần nữaKhái niệm phạm vi phiên Ninject trong MVC3

vì vậy, câu hỏi của tôi là

Khi tôi liên kết các dịch vụ sử dụng Ninject loại phạm vi tôi nên lựa chọn, không có phiên mỗi phạm vi trong Ninject, vì vậy tốt nhất là gì cách để thực hiện yêu cầu? hay tôi đã đi sai hướng?

Tôi đã tạo nhà cung cấp tùy chỉnh cho một trong các dịch vụ của mình sẽ tạo dịch vụ dựa trên chi tiết tên người dùng được lấy từ Controller.User.Identity.Name hiện tại. Mã bên dưới sẽ không hoạt động vì biến cục bộ userName bị thiếu, làm cách nào tôi có thể chuyển giá trị tên người dùng vào nhà cung cấp tùy chỉnh của tôi qua Ninject, để tôi có thể nhận nó từ IContext ??

public class TfsConnectionManagerProvider : Provider<TfsConnectionManager> 
    { 
     protected override TfsConnectionManager CreateInstance(IContext context) 
     { 
      Uri serverUri = new Uri(ConfigurationHelper.TfsServerUrl); 
      // Connect to the server without impersonation 
      using (TfsTeamProjectCollection baseUserConnection = TfsTeamProjectCollectionFactory.GetTeamProjectCollection(serverUri)) 
      { 
       // Get the identity management service 
       IIdentityManagementService ims = baseUserConnection.GetService<IIdentityManagementService>(); 

       // Get the identity to impersonate 
       TeamFoundationIdentity identity = ims.ReadIdentity 
       (
        IdentitySearchFactor.AccountName, 
        userName, //NOTE: How can I get user name value from IContext??? 
        MembershipQuery.None, 
        ReadIdentityOptions.None 
       ); 

       // Connect using the impersonated identity 
       using (TfsTeamProjectCollection impersonatedConnection = new TfsTeamProjectCollection(serverUri, identity.Descriptor)) 
       { 
        WorkItemStore store = impersonatedConnection.GetService<WorkItemStore>(); 

        return new TfsConnectionManager 
        { 
         Store = store 
        }; 
       } 
      } 
     } 
    } 
+0

Xem thêm http: // stackoverflow.com/questions/4687707/ninject-per-session-singleton –

Trả lời

2

Tôi bật ra để sử dụng Nhà cung cấp tùy chỉnh để tạo cá thể và trong nhà cung cấp tùy chỉnh mà tôi đã kiểm tra nếu nó tồn tại trong phiên hay không.

Các ràng buộc được thực hiện như sau

Bind<IRepository>().ToProvider(new TfsRepositoryProvider()); 

Nhà cung cấp tùy chỉnh là dưới

public class TfsRepositoryProvider : Provider<TfsRepository> 
    { 
     private const string SesTfsRepository = "SES_TFS_REPOSITORY"; 

     protected override TfsRepository CreateInstance(IContext context) 
     { 
      // Retrieve services from kernel 
      HttpContextBase httpContext = context.Kernel.Get<HttpContextBase>(); 

      if (httpContext == null || httpContext.Session == null) 
      { 
       throw new Exception("No bind service found in Kernel for HttpContextBase"); 
      } 

      return (httpContext.Session[SesTfsRepository] ?? (
        httpContext.Session[SesTfsRepository] = new TfsRepository(context.Kernel.Get<IWorkItemStoreWrapper>())) 
       ) as TfsRepository; 
     } 
    } 
0

OK, bạn có thể lưu/lưu trữ thông tin người dùng trong ứng dụng và chỉ gọi dịch vụ bên ngoài nếu bạn không có thông tin người dùng (gần đây). Trong truy xuất thông tin người dùng của bạn "lớp", bạn chỉ cần chương trình hai khả năng.

Nơi bạn lưu vào bộ nhớ cache, hoàn toàn tùy thuộc vào bạn. Bạn có thể lưu trữ thông tin này ví dụ trong một cơ sở dữ liệu cục bộ.

Dường như tôi đã hiểu bạn sai, lời xin lỗi của tôi (bên dưới câu trả lời ban đầu của tôi).

Bạn có thể sử dụng nhà máy (trừu tượng) chứa thành viên tĩnh dịch vụ của bạn (ví dụ) để nó sẽ được sử dụng lại.

Mặc dù phụ thuộc vào dịch vụ của bạn, điều này có thể có một số phụ không mong muốn hiệu ứng (Tôi đã làm điều này một lần với dịch vụ dữ liệu và trong một ASP.NET MVC3 ứng dụng bối cảnh dữ liệu của tôi được kinda screwed do một số kỳ diệu mà xảy ra). Tất cả tôi muốn nói với điều này là: hãy cẩn thận và kiểm tra nó tốt.

+0

Xin lỗi, tôi có thể không giải thích rõ câu hỏi của tôi, việc khởi tạo dịch vụ liên quan đến các cuộc gọi đến một số dịch vụ web mà sau đó sẽ trả lại thông tin cụ thể của người dùng. Tôi không thể làm cho nó tĩnh vì nó là người dùng cụ thể – Ming

+0

Ow, sau đó tôi hiểu lầm bạn :). Những gì bạn có thể làm là cố gắng lưu trữ dữ liệu người dùng (thông tin) trong ứng dụng của bạn và chỉ gọi các dịch vụ bên ngoài nếu bạn không có thông tin người dùng. – Styxxy

+0

Có, vì vậy mà nói đến câu hỏi thực sự của tôi ở trên - làm thế nào tôi có thể đạt được nó thông qua Ninject ràng buộc bằng cách sử dụng phạm vi – Ming

7

Phạm vi phiên là cố tình không được cung cấp trong Ninject, bởi vì việc cung cấp dịch vụ ở trạng thái phiên là sai trong hầu hết mọi trường hợp. Bạn nên rất cẩn thận về việc sử dụng trạng thái phiên vì nó mang lại nhiều nhược điểm.

Cố gắng có một ứng dụng không quốc tịch ở vị trí đầu tiên.

Nếu có lý do chính đáng để có dữ liệu trong phạm vi phiên, hãy đặt dữ liệu đó (không phải dịch vụ) vào trạng thái phiên và sử dụng các dịch vụ nằm trong phạm vi đơn, tạm thời hoặc yêu cầu để xử lý (tách dữ liệu và chức năng)).

+0

Cảm ơn Remo, có thể gây nhầm lẫn khi tôi đặt phiên trong mô tả ban đầu của mình. Tôi không có nghĩa là tôi sẽ sử dụng phiên để giữ dữ liệu, mục đích là sử dụng lại đối tượng người dùng cụ thể mà trả về từ dịch vụ dài hạn càng nhiều càng tốt với khung công tác Ninject. Bất kỳ thích hợp ý tưởng thiết kế sẽ được hoan nghênh – Ming

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