2009-12-09 33 views
15

Tôi đã sử dụng Vùng chứa Windsor IoC cho ứng dụng dựa trên web của mình, để giải quyết việc triển khai lớp truy cập dữ liệu mà ứng dụng sẽ sử dụng.MEF: Tôi nên đặt bộ phận sắp xếp ở đâu?

Giao diện người dùng của ứng dụng web sẽ bao gồm các trang và mỗi trang bao gồm các đơn vị nhỏ được gọi là các portlets. (Khái niệm của họ có phần tương tự như các widget.) Các portlet này về cơ bản là các điều khiển web và có thể được cấu hình trong thời gian chạy cho mỗi trang một cách bất ngờ.

Ứng dụng sẽ xuất xưởng với một số tính năng này, nhưng tôi muốn cho phép mở rộng nó dễ dàng.

Tôi đã tìm ra rằng cơ chế này chính xác là những gì MEF được xây dựng. Vì vậy, tôi đã quyết định triển khai hệ thống theo cách mà nó phát hiện ra các portlet sử dụng MEF. Sau đó, tôi nhận ra rằng nó cũng có thể làm những gì tôi hiện đang sử dụng Windsor cho, vì vậy tôi quyết định mương Windsor ủng hộ MEF.

Rõ ràng, tôi sẽ phải sử dụng DirectoryCatalog, quét các .dll trong thư mục bin của ứng dụng và trả lại mọi thứ tôi cần.

Tôi đã đọc một số hướng dẫn, ví dụ và tất cả các câu hỏi liên quan đến MEF trong StackOverflow. Tôi đã tìm ra cách dễ nhất để sử dụng MEF là thông qua PartInitializer mà Glenn Block đã đề cập trong các hướng dẫn của anh ta, nhưng tôi nhận ra rằng nó không có trong MEF. Trên thực tế, nó nằm trong đoạn code tôi đã tải về từ CodePlex, nhưng trong một assembly riêng biệt, và chỉ ở nguồn, không phải ở dạng nhị phân. (Điều này có nghĩa rằng nó không phải là một phần của MEF? Hay điểm trong việc đưa nó vào một dự án riêng biệt là gì?) Sau đó, tôi nhận ra rằng nó là dành cho Silverlight, vì vậy nó không thực sự giúp tôi. (Hoặc tôi chỉ nên biên dịch mà chống lại .NET 3.5, hoặc bao gồm nó trong dự án của tôi, và tôi tốt để đi?)

Vì vậy, bây giờ tôi có một vấn đề sau đây: nơi tôi nên đặt các CompositionContainer trong ứng dụng của tôi?

Có một điều nữa tôi muốn cân nhắc: tôi có nên chỉ sử dụng một Trình soạn thảo nội dung trong suốt thời gian tồn tại của ứng dụng hay tốt hơn hết là tạo vùng chứa cho mỗi lần tôi cần?

Trả lời

11

Câu hỏi hay.

Nói chung về những câu hỏi về nơi để đặt các thùng chứa, tôi khuyên các bài viết sau: http://blogs.msdn.com/nblumhardt/archive/tags/Container+Managed+Application+Design/default.aspx

Trong của MEF trên web, các ứng dụng dựa trên web là một chút tricker vì request/response thiên nhiên và mối quan tâm về khả năng mở rộng. Đối với trang web, bạn có thể muốn có một hệ thống phân cấp các vùng chứa, một thư mục gốc cho ứng dụng được chia sẻ, cũng như các contianers con theo yêu cầu. Các thùng chứa trẻ em phải sống và chết theo yêu cầu để bảo tồn tài nguyên. Vùng chứa được chia sẻ chứa các dịch vụ được tất cả người gọi chia sẻ.

Bạn có thể kiểm tra những bài viết này cho hiểu rõ hơn về làm thế nào để làm điều này:

http://blogs.msdn.com/hammett/archive/2009/04/23/mef-and-asp-net-mvc-sample.aspx http://blogs.msdn.com/hammett/archive/2009/07/15/mef-and-asp-net-mvc-sample-updated.aspx http://mef.codeplex.com/wikipage?title=Parts%20Lifetime&referringTitle=Guide

As far as PartInitializer, tôi sẽ tránh sử dụng một cái gì đó giống như nó, trừ khi bạn phải làm vậy. ASP.NET cung cấp đầy đủ các móc trong đường ống thông qua các trình xử lý HTTP, các mô-đun và để cho phép tự động soạn thảo khi tạo.

Nơi duy nhất tôi sẽ thấy bằng cách sử dụng PI trên web sẽ có thể nằm trong quyền kiểm soát của người dùng tùy chỉnh. PI tàu như một phần của Silverlight 4 và không có sẵn trong hộp cho .NET 4.0.Tôi đã tạo phiên bản có thể sử dụng cho .NET 4.0 mà bạn có thể tìm thấy tại đây: http://cid-f8b2fd72406fb218.skydrive.live.com/self.aspx/blog/Composition.Initialization.Desktop.zip

HTH Glenn

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