2009-05-13 30 views
5

Tôi có một ứng dụng MEF (Microsoft Extension Framework) để tải một số assembly từ một thư mục. Tôi cần liệt kê các hội đồng sản xuất bất kỳ hàng xuất khẩu nào cho đơn xin của tôi.Làm thế nào để liệt kê các assembly trong AggregateCatalog hoặc DirectoryCatalog trong MEF?

Một cách để thực hiện điều này là liệt kê các mục nhập gọi số GetExportedObject().GetType().Assembly. Nhưng nó sẽ được sạch hơn để làm điều này mà không cần instantiation nhập khẩu. Có cách nào để có được lắp ráp nạp từ một cửa hàng hoặc bất cứ điều gì khác?

Tôi cần hội đồng để có được các thuộc tính của họ như bản quyền, phiên bản, tên và như vậy. Thư mục của tôi có thể chứa cả hai hội đồng với xuất khẩu và không có những người thân, nhưng tôi chỉ cần hội đồng thỏa mãn bất kỳ hàng nhập khẩu nào trong ứng dụng.

Trả lời

2

AssemblyCatalog có thuộc tính Assembly. AggregateCatalog không có cách nào để lấy thông tin này trực tiếp - không có gì đảm bảo rằng các catalog bên trong thậm chí tải các phần của chúng từ một assembly. DirectoryCatalog không có khả năng này mặc dù có thể thêm nó nếu có lý do chính đáng.

Tại sao bạn muốn nhận danh sách các hội đồng? Bạn có thể tốt hơn không sử dụng catalag thư mục, thay vì chỉ quét và tải các assembly trong một thư mục, và tạo một AssemblyCatalog cho mỗi thư mục và thêm nó vào một AggregateCatalog.

EDIT: MEF không có cách lấy danh sách tất cả các xuất đã được "sử dụng" trong bố cục. Bạn có thể có thể viết danh mục của riêng bạn mà sẽ trả về một phần định nghĩa được vỏ xung quanh định nghĩa phần mặc định và theo dõi các bộ phận có GetExportedObject được gọi là trên chúng. Bạn có thể sử dụng các API trong ReflectionModelServices để tìm ra loại nào tương ứng với một định nghĩa phần đã cho từ các danh mục mặc định. Lưu ý rằng việc viết một danh mục như vậy có thể không phải là một cam kết đơn giản.

+0

Tôi đã cập nhật câu hỏi về lý do tại sao tôi cần hội đồng. Trên thực tế, thậm chí có DirectoryCatalog trả lại các hội đồng sẽ không giải quyết mục tiêu của tôi bởi vì danh sách có thể chứa dll MEF mà không có gì để làm với nhập khẩu _my_. Nếu tôi có thể lấy assembly từ Export mà không gọi GetExportedObject, hoặc có assembly nhập khẩu thỏa mãn theo cách khác ... –

+0

Tôi sẽ bổ sung thêm rằng tôi cần loại chức năng tương tự này.Tôi đang tích hợp với một hệ thống khác sử dụng BuildManager và tôi muốn thêm các assembly mà tôi đang sử dụng với MEF vào BuildManager. –

2

Đây là giải pháp hiện tại của tôi mà làm việc độc đáo:

  1. Không sử dụng DirectoryCatalog, lắp ráp tải trực tiếp và tạo ra một AssemblyCatalog từ họ.
  2. Sử dụng AssemblyCatalog.Parts để tìm hiểu xem hội đồng nào đã xuất, cho phép người dùng ủy quyền cho họ.
  3. Chỉ thêm AssemblyCatalog được ủy quyền vào AggregateCatalog, được viết trong bố cục.
0

Nếu bạn có quyền truy cập vào nguồn của các hội đồng đó thì tôi có giải pháp thay thế để thêm từng cụm một. Bạn có thể tạo một giao diện được gọi là IModule và làm cho nó trở thành một yêu cầu cho tất cả các assembly của bạn để xuất khẩu nó. Sau đó, bạn có thể ImportAll chúng vào bootstraper của bạn:

[ImportMany] 
public List<IModule> Modules { get; set; } 

Danh sách này sẽ chứa một danh sách tất cả các lớp học Mô-đun thông qua đó bạn có thể truy cập vào lắp ráp:

var module1 = Logic.Instance.Modules[0]; 
var fullename = module1.GetType().Assembly.FullName; 
5

Đây là một cách để làm việc đó, và được sử dụng trong Caliburn.Micro:

var aggregateCatalog = new AggregateCatalog(...); 
var assemblies = aggregateCatalog.Parts 
    .Select(part => ReflectionModelServices.GetPartType(part).Value.Assembly) 
    .Distinct() 
    .ToList(); 
+0

câu trả lời hay nhất! thông qua cách này tôi có thể tiếp tục sử dụng một DirectoryCatalog và vẫn nhận được một danh sách của tất cả các hội đồng đã được nạp (các phần) thông qua MEF. Trong đoạn mã trên tôi đã thay đổi AggregateCatalog thành DirectoryCatalog. – juFo

+0

Cảm ơn bạn! Điều này đã cứu tôi rất nhiều xung đột. Tôi biết phải có một số cách để có thêm thông tin từ danh sách 'Phụ tùng' nghèo nàn đó. –

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