2009-11-20 19 views
19

MEF cho phép bạn nhập nhiều phần thông qua việc sử dụng thuộc tính ImportMany. Làm thế nào để nó xác định thứ tự trong đó nó lấy các xuất khẩu có liên quan và thêm chúng vào số đếm bạn đang cư trú? Ví dụ, làm thế nào tôi sẽ nhập nhiều IRules mà phải bắn theo một thứ tự cụ thể? Cách duy nhất tôi có thể nghĩ đến là phải có một tài sản OrderValue trong IRule và sắp xếp bằng tay:Làm thế nào để xác định thứ tự nhập khẩu của MEF?

public class Engine 
{ 
    [ImportMany] 
    public IEnumerable<IRule> Rules { get; set; } 

    public void Run() 
    { 
    // ... 
    // Initialise MEF 
    // ... 

    // 
    // Do I need to manually order Rules here? 
    // 

    foreach (IRule rule in Rules) 
    { 
     // Must execute in a specific order 
     rule.Execute(); 
    } 
    } 
} 
+0

Tôi nghĩ rằng giả định của bạn là đúng - có vẻ như một chút bên ngoài của vấn đề MEF được thiết kế để giải quyết. – GraemeF

Trả lời

29

Theo mặc định, MEF không đảm bảo bất kỳ đơn hàng nào của hàng xuất khẩu được nhập khẩu. Tuy nhiên trong MEF bạn có thể thực hiện một số thứ tự bằng cách sử dụng một số siêu dữ liệu và một bộ sưu tập tùy chỉnh. Ví dụ: bạn có thể làm điều gì đó như:

public interface IRule { } 

[Export(typeof(IRule))] 
[ExportMetadata("Order", 1)] 
public class Rule1 : IRule { } 

[Export(typeof(IRule))] 
[ExportMetadata("Order", 2)] 
public class Rule2 : IRule { } 

public interface IOrderMetadata 
{ 
    [DefaultValue(Int32.MaxValue)] 
    int Order { get; } 
} 

public class Engine 
{ 
    public Engine() 
    { 
     Rules = new OrderingCollection<IRule, IOrderMetadata>(
          lazyRule => lazyRule.Metadata.Order); 
    } 

    [ImportMany] 
    public OrderingCollection<IRule, IOrderMetadata> Rules { get; set; } 
} 

Sau đó, bạn sẽ có một bộ quy tắc được đặt hàng bởi siêu dữ liệu. Bạn có thể tìm thấy mẫu OrderingCollection tại http://codepaste.net/ktdgoh.

+0

Cảm ơn! Đã thay đổi câu trả lời được chấp nhận của tôi cho bạn. –

+0

Giải pháp tuyệt vời! – Kilhoffer

+0

Dường như mẫu OrderingCollection không còn tồn tại nữa. – tofutim

1

Bạn có thể có các quy tắc nhập lẫn nhau trong trật tự (sử dụng mô hình trang trí), nhưng sau đó mỗi quy tắc sẽ cần phải biết về quy tắc cụ thể trước đó, mà có lẽ không phải là điều bạn muốn.

MEF có mặt để giúp bạn khám phá các phần, những gì bạn làm với chúng sau đó tùy thuộc vào bạn. Nếu bạn muốn sắp xếp các phần thì hãy tiếp tục, không có gì sai với điều đó!

+0

Điều này đã xác nhận những gì tôi mong đợi, cảm ơn. –

+0

Đối với tôi, có vẻ như hiệu quả hơn khi chèn các phần tử vào danh sách được sắp xếp hơn là tạo danh sách và sau đó sắp xếp – Assimilater

6

Cách tốt nhất để đạt được thứ tự này trong MEF là sử dụng các cơ sở siêu dữ liệu của chúng tôi. Bạn có thể đính kèm siêu dữ liệu của riêng mình vào các lần xuất mà bạn có thể sử dụng để đặt hàng và lọc. Siêu dữ liệu cũng cho phép bạn trì hoãn việc khởi tạo các phần cho đến khi chúng thực sự cần thiết. Ngoài ra, bạn có thể tạo các thuộc tính Xuất tùy chỉnh cung cấp một cách sạch sẽ tốt đẹp để cung cấp siêu dữ liệu.

Kiểm tra liên kết này để biết thông tin về làm thế nào để xác định siêu dữ liệu và tùy chỉnh xuất khẩu: link text

Bạn cũng có thể tìm this chủ đề trên các diễn đàn của chúng tôi MEF hữu ích. Bạn sẽ tìm thấy một cuộc thảo luận về phương pháp AdaptingCollection cho phép bạn sử dụng bộ sưu tập tùy chỉnh áp dụng bộ lọc/thứ tự siêu dữ liệu.

HTH Glenn

+0

Cảm ơn Glenn, cuối cùng tôi đã có một cách tiếp cận khác nhưng tôi chắc chắn sẽ ghi nhớ điều này trong thời gian tới. Tôi sẽ chấp nhận câu trả lời của bạn nhưng như Wes đã nhận được ngay trước khi với một phản ứng tương tự, tôi nghĩ rằng nó có thể công bằng hơn để chấp nhận của mình. –

+0

Đó là ok, Wes dựa trên phiên bản của mình trên của tôi :-) –

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