2012-01-09 32 views
9

Tôi có một lớp tĩnh trong giải pháp được sử dụng để làm việc với các assembly khác nhau. Tôi muốn liên kết chúng thông qua MEF, vì vậy tôi đã thực hiện một lĩnh vực trong một lớp học.Sử dụng C# MEF với các lớp tĩnh

[Import(typeof(A))] 
    static private A _a1; 

Sau đó, tôi có một phương pháp mà tôi vượt qua lắp ráp tên như một cuộc tranh cãi:

public static A LoadPackage(string filePath) 
    { 
      var catalog = new AggregateCatalog(); 
      catalog.Catalogs.Add(new AssemblyCatalog(filePath)); 
      var _container = new CompositionContainer(catalog); 
      ??? 
    } 

Vậy là có một cách bây giờ phải nhập khẩu loại từ lắp ráp theo quy định của filepath?

tôi không thể làm:

_container.ComposeParts(this); 

từ lớp là 'tĩnh và không phải tôi có thể làm điều này

_container.ComposeParts(_a1); 

(mà có thể là hoàn toàn sai lầm khi bắt đầu với) kể từ A không có bất kỳ nhà thầu nào (do đó _a1 là không)

+1

Có lý do nào cần phải tĩnh không? Bất cứ điều gì bạn nhập/xuất sẽ là một Singelton theo mặc định, tốt hơn là có một lớp tĩnh trong hầu hết các trường hợp. – eandersson

+0

đây là một trong những tùy chọn tôi đang xem xét. Lý do để giữ nó tĩnh là tôi không muốn thay đổi mã trên tất cả dự án của tôi (ví dụ - Tôi lười biếng +)) – noaRAVE

+0

Tôi khá chắc chắn rằng bạn không thể sử dụng các lớp tĩnh trực tiếp với MEF, nhưng tôi không Không biết điều đó. – eandersson

Trả lời

6

Vâng nó chỉ ra rằng phương pháp tôi đang tìm kiếm là GetExportedValue (yeah, tôi bỏ qua chức năng cơ bản):

static private A _a1; 

public static A LoadPackage(string filePath) 
{ 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(filePath)); 
     var _container = new CompositionContainer(catalog); 
     _a1 = _container.GetExportedValue<A>(); 
} 

Và tôi đã lĩnh vực của tôi điền (chỉ trong trường hợp, tôi đã chuyển nó đến lớp khác , và nó trông gọn gàng và sạch sẽ bây giờ)

+0

Không phải là một giải pháp tốt - như đã đề cập bởi Wim ở trên, tốt hơn nhiều để chỉ sử dụng nhập MEF của một phần được chia sẻ và tránh các lớp/phương thức tĩnh bất cứ khi nào có thể. –

11

MEF được thiết kế để tạo và khởi tạo đối tượng cho bạn. Nó không xử lý trạng thái trong các lớp tĩnh.

Tôi khuyên bạn nên tạo lớp và các trường của trường không tĩnh và đánh dấu nó bằng [PartCreationPolicy(CreationPolicy.Shared)] nếu bạn muốn thực thi hành vi đơn lẻ.

Xem thêm this other question trên MEF và mẫu đơn.

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