2009-11-17 23 views
5

Tôi đang thử Khung quản lý mở rộng lần đầu tiên trong Visual Studio 2010 beta 2 bằng cách sử dụng System.ComponentModel.Composition từ .net-4.0.Hướng dẫn MEF sử dụng bất kỳ hội đồng nào có sẵn

Tôi đã không thể tải tệp CompositionContainer để tìm các hội đồng triển khai của tôi bằng cách sử dụng hai quy trình thay thế bên dưới.

nỗ lực đầu tiên (điều này đã làm việc trong một thông cáo CodePlex cũ của MEF):

var composition = new CompositionBatch(); 
composition.AddPart(this); 
var container = new CompositionContainer(new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
container.Compose(composition); 

nỗ lực thứ hai (điều này làm việc trong phiên bản beta 1, tôi nghĩ):

var aggregateCatalog = new AggregateCatalog(
    new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
    new DirectoryCatalog(AppDomain.CurrentDomain.BaseDirectory)); 
var compositionContainer = new CompositionContainer(aggregateCatalog); 
compositionContainer.ComposeParts(this); 

Có một phương pháp mới để làm điều này trong bản beta 2?

CHỈNH SỬA: Hóa ra không có gì liên quan đến bố cục. Tôi đã có một thuộc tính tĩnh đại diện thực hiện nhập khẩu của tôi:

[Import] public static ILog Log { get; set; } 

mà cần phải có được:

[Import] public ILog Log { get; set; } 

tôi đánh dấu câu trả lời của Daniel là chấp nhận vì những lời khuyên hiền triết của gỡ lỗi một cách kỹ lưỡng hơn giải quyết vấn đề.

+0

Tôi đã sử dụng bản Beta 2 trong vài tuần và đã sử dụng ví dụ thứ 2 của bạn mà không gặp bất kỳ vấn đề nào. Bạn có bất kỳ bộ phận nội bộ trong lắp ráp thực hiện của bạn hoặc họ chỉ nằm trong BaseDirectory? Bạn đã có thể xác nhận những gì AppDomain.CurrentDomain.BaseDirectory bản đồ để tại thời gian chạy? Ngoài ra, lớp học có chứa các đoạn mã trên có chứa bất kỳ Nhập khẩu được khai báo nào không? Chỉ cần chắc chắn vì không có gì sẽ được chọn nếu trường hợp của lớp (điều này) không có bất kỳ nhập khẩu – JamesEggers

+0

Tôi phải làm một cái gì đó daft. Việc triển khai rất đơn giản trong khi tôi cố gắng làm cho nó hoạt động. BaseDirectory là hợp lệ, lớp này có nhập khẩu. Tuy nhiên, một chút headscratching và tôi sẽ nhận được ở đó cuối cùng. – grenade

+0

Bất cứ ai có thể giải thích lý do tại sao không thể sử dụng [Nhập] cho thuộc tính tĩnh? – Dave

Trả lời

1

Lỗi gì? Có một nhập khẩu mà bạn mong muốn được hài lòng mà không được hài lòng? Bạn đang gọi GetExports() và nó đang thất bại?

Bạn có thể ngắt trong trình gỡ lỗi sau khi danh mục đã được tạo và di chuột qua biến aggregateCatalog để kiểm tra và xem phần nào nằm trong đó. Tôi đoán là các bộ phận có thể nằm trong danh mục và vấn đề ở đâu đó trong mã của bạn. Nguyên nhân có thể là bạn có một bộ sưu tập nhập khẩu đang sử dụng thuộc tính [Nhập] thay vì [ImportMany] và/hoặc các phần của bạn đang bị từ chối vì chúng có thể không được đáp ứng.

0

Tôi bạn hãy xem phương pháp Soạn thư trong SoapBox Core Host, bạn có thể xem bằng cách sử dụng DirectoryCatalog để tìm tất cả các phần trong thư mục. Tuy nhiên, điều này không được biên soạn chống lại .NET 4, chỉ chống lại bản xem trước của MEF:

private bool Compose() 
    { 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new DirectoryCatalog(".")); 

     _container = new CompositionContainer(catalog); 

     try 
     { 
      _container.ComposeParts(this); 
     } 
     catch (CompositionException compositionException) 
     { 
      MessageBox.Show(compositionException.ToString()); 
      return false; 
     } 
     return true; 
    } 
Các vấn đề liên quan