2012-06-15 28 views
7

Sau khi thực hiện một số nghiên cứu trên MEF tôi đi qua các CreationPolicy.Shared tài sản mà theo MSDN:Singleton giống như hành vi với Dependency Injection

Chỉ định rằng một thể hiện duy nhất của liên ComposablePart sẽ được tạo bởi CompositionContainer và được chia sẻ bởi tất cả người yêu cầu.

Âm thanh tốt miễn là tôi luôn đảm bảo rằng một và chỉ một vùng chứa có thể truy cập vào lớp mà tôi xuất với chính sách này. Vì vậy, làm thế nào để tôi đi về đảm bảo rằng chỉ có một container bao giờ truy cập loại xuất khẩu của tôi? Đây là kịch bản của tôi:

Tôi có dịch vụ Windows cần nhấn vào một lớp giống như singleton cho một số dữ liệu trong bộ nhớ. Dữ liệu không liên tục nên tôi muốn nó được tạo mới bất cứ khi nào dịch vụ khởi động nhưng nó không phục vụ mục đích nào khi dịch vụ bị dừng lại. Nhiều chủ đề trong dịch vụ của tôi sẽ cần phải đọc và ghi vào đối tượng này theo kiểu an toàn chỉ vì vậy kế hoạch ban đầu của tôi là kế thừa từ ConcurrentDictionary để đảm bảo hoạt động an toàn cho luồng.

Chủ đề sẽ được khai thác vào lớp này tất cả được kế thừa từ một lớp cơ sở trừu tượng duy nhất, vậy có cách nào để lớp này (và chỉ lớp này) nhập từ MEF và có công việc này theo cách tôi muốn không?

nhờ cho bất cứ lời khuyên bạn có thể có, tôi hơi mới để MEF vì vậy tôi vẫn đang học các ins and outs

+1

Tôi đã sử dụng Ninject với chế độ "singleton" của nó cho một ràng buộc với hiệu ứng tuyệt vời. Chỉ cần cẩn thận để giữ bất cứ điều gì nó được MEF cung cấp cách an toàn thread (không có tác dụng phụ của tiểu bang hoặc funny). – bluevector

+0

@jonnyGold Cảm ơn, tôi đã không sử dụng Ninject trước đây ... nó có piggyback trên MEF ở tất cả hay là nó độc đáo của nó DI framework? – snappymcsnap

+1

Đó là khuôn khổ riêng của nó. Bạn có thể lấy nó thông qua nuget và có chuyên môn cho MVC và WCF. Điều yêu thích của tôi về nó là các ràng buộc được khai báo trong mã, vì vậy bạn không thể mắc lỗi kết hợp kiểu. Hoặc một lỗi đánh máy, cho vấn đề đó. Ngoài ra, các ràng buộc theo ngữ cảnh thực sự mạnh mẽ. – bluevector

Trả lời

1

Nếu nó hoàn toàn phải là một singleton giữa container khác nhau, bạn có thể sử dụng một constructor tư nhân và phơi bày một thuộc tính tĩnh Instance, như thể nó là một singleton "cổ điển" không chứa container. Sau đó, trong thư mục gốc tổng hợp, sử dụng ComposeExportedValue để đăng ký nó với các container:

container.ComposeExportedValue(MySingleton.Instance); 
+0

không hoàn toàn, nếu có thể tôi chỉ muốn trưng bày nó vào một thùng chứa duy nhất và khung MEF sẽ đảm bảo nó là một singleton theo mặc định. Nếu điều này là không thể tuy nhiên sau đó tôi thấy không có lợi thế để sử dụng MEF cho điều này ở nơi đầu tiên – snappymcsnap

+1

Tôi không chắc chắn tôi hiểu chính xác những gì bạn đang yêu cầu. Bạn nên đảm bảo rằng chỉ có một vùng chứa tồn tại. Sau đó 'CreationPolicy.Shared' sẽ dẫn đến một singleton. Bạn đang nghĩ đến việc tạo nhiều thùng chứa? Bởi vì đó sẽ không điển hình. –

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