2010-07-27 39 views
21

Tôi không chắc chắn khi nào nên sử dụng SingletonScope() vs TransientScope() vs RequestScope() khi tôi thực hiện ràng buộc trong tệp global.cs của mình. Tôi có ví dụ cuộc gọi của tôi đến MongoSession (sử dụng NoRM và dự án mvcStarter http://mvcstarter.codeplex.com/) được đặt thành SingletonScope nhưng tôi đã tạo một kho lưu trữ sử dụng đối tượng MongoSession này để thực hiện cuộc gọi đến Mongo dễ dàng hơn, ví dụ, tôi có một NewsRepository sử dụng MongoSession để tìm kiếm các mục Tin tức của tôi từ dữ liệu. Ví dụ, tôi có một cuộc gọi tìm nạp các mục Tin tức có DisplayOnHome được đặt thành true và nhận phiên bản mới nhất của CreationDate. Nên một kho lưu trữ như vậy được SingletonScope hoặc sẽ RequestScope sẽ thích hợp hơn?Khi nào sử dụng Singleton vs Transient vs Request sử dụng Ninject và MongoDB

Khi nào tôi nên sử dụng từng bộ lọc và tại sao?

+0

cũng xem: http: // stackoverflow!.com/questions/3338449 (Có trong câu trả lời của tôi nhưng ai đó đã quyết định cắt nó ra để không chắc chắn nếu nó có liên quan) –

+0

@RubenBartelink Vui lòng cập nhật liên kết. Nó bị hỏng. – shankbond

+0

@shankbond câu hỏi đã bị xóa bởi quesitoner thew Thêm vào câu trả lời dưới đây –

Trả lời

21

Nói chung trong ứng dụng web, bạn muốn tiểu bang yêu cầu phạm vi càng nhiều càng tốt.

Chỉ trong trường hợp tối ưu hóa ở mức độ thấp, bạn có thể chạy vào trường hợp thích hợp để tạo đối tượng đơn lẻ (và cơ hội là bạn sẽ kéo logic lưu trữ/chia sẻ đó vào một lớp khác được kéo vào dưới dạng phụ thuộc vào các đối tượng [phạm vi yêu cầu] khác của bạn và tạo rằng phạm vi singleton). Hãy nhớ rằng một singleton trong bối cảnh của một ứng dụng web có nghĩa là nhiều chủ đề sử dụng các đối tượng tương tự. Đây là tin hiếm khi tốt. Trên cùng một cơ sở, phạm vi thoáng qua là mặc định đơn giản nhất (và đó là lý do tại sao Ninject 2 làm như vậy) - phạm vi yêu cầu chỉ nên đi vào phương trình khi cần chia sẻ điều gì đó vì lý do hiệu suất, v.v. đó đơn giản là bối cảnh chia sẻ [như được đề cập trong câu trả lời khác]).

+0

Ok đó là một mô tả tốt, vì vậy tôi nên sử dụng hầu hết thời gian RequestScope nhưng tại sao Rob sử dụng SingletonScope cho MongoSession trong dự án MVC Starter? – VinnyG

+0

Nếu 'MongoSession' là luồng an toàn (chắc chắn là trường hợp nếu nó không duy trì bất kỳ trạng thái nào), singleton là tốt [nhưng hai cái kia cũng hoạt động]. Nó chỉ cần thiết để đi Singleton nếu có những thứ bạn muốn chia sẻ (và nó có thể giúp perf nếu xây dựng trường hợp là tốn kém). Giữ nội dung lâu dài và truy cập nó từ nhiều luồng có thể tốt nếu tất cả các bit 'It Depends' (chủ đề an toàn, trạng thái lưu trữ không bao giờ cần phải được đổ, hiệu quả để sử dụng từ nhiều luồng, v.v.) mặc định. Hy vọng điều này làm rõ một chút. –

+0

Còn loại ứng dụng khác thì sao? – Rushino

3

Tôi đoán câu trả lời sẽ tùy thuộc vào việc MongoSession của bạn có phải là đơn vị công việc hay không. Hầu hết các lớp liên quan đến cơ sở dữ liệu mà tôi đã làm việc (chủ yếu trong ngữ cảnh ORM, chẳng hạn như NHibernate hoặc EF4) xoay quanh ngữ cảnh, thực thể và trạng thái được theo dõi đại diện cho đơn vị làm việc . Một đơn vị công việc không bao giờ nên được giữ lâu hơn thời gian cần thiết để thực hiện đơn vị công việc đã cho, sau đó đơn vị phải được cam kết hoặc quay trở lại. Điều đó có nghĩa là bạn nên sử dụng RequestScope.

Nếu MongoSession của bạn là không một đơn vị công việc, bạn có thể giữ nó xung quanh cho cuộc đời của một phiên MVC, trong trường hợp này SessionScope sau đó sẽ là thích hợp.

+0

MongoSession không phải là một đơn vị công việc, cảm ơn câu trả lời! – VinnyG

0

Từ câu hỏi bị xóa theo yêu cầu của @shankbond trên


Các Dispos al không nhất thiết phải thực hiện đồng bộ trên thread yêu cầu chính của bạn như người ta có thể giả định.

Bạn có thể muốn giấu một Block và sau đó Dispose() nó ở một giai đoạn thích hợp trong yêu cầu của bạn (làm thế nào thì bạn sẽ xử lý trường hợp ngoại lệ?)

Có một cái nhìn tại các Kỳ Thi Ninject để biết thêm ví dụ (nghiêm túc, đi tìm kiếm - chúng ngắn và rõ ràng và tôi didnt hối tiếc khi tôi nghe lần thứ 3 tôi đã nói đến)

xem http://kohari.org/2009/03/06/cache-and-collect-lifecycle-management-in-ninject-20/

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