2010-10-17 28 views
5

Tôi vừa mới bắt đầu sử dụng MEF và đã gặp phải vấn đề ban đầu.MEF 'Xuất không thể gán để nhập' lỗi

Tôi có một giao diện được gọi DataService:

namespace DataAccess 
{ 
    interface IDataService 
    { 
    string Name { get; } 
    string Description { get;} 

    List<String> GetPeople(); 
    } 
} 

Có 2 triển khai các giao diện này, một cho SQL Server và một cho Oracle. Dưới đây là triển khai Oracle, việc triển khai SQL Server hoàn toàn giống nhau.

namespace DataAccess 
{ 
[Export(typeof(IDataService))] 
[ExportMetadata("Name","Oracle")] 
[ExportMetadata("Description","Oracle Data Service")] 
public class Oracle : IDataService 
{ 

    #region IDataService Members 

    public string Name 
    { 
     get { return "Oracle"; } 
    } 

    public string Description 
    { 
     get { return "Provides data access to Oracle database"; } 
    } 

    public List<string> GetPeople() 
    { 
     return new List<String>() { "Oracle boo", "Oracle boo1" }; 
    } 

    #endregion 
} 
} 

Tên và thuộc tính mô tả hiện không còn tồn tại khi tôi đã thay thế các siêu dữ liệu này bằng siêu dữ liệu. Như bạn có thể thấy, chúng là những đối tượng rất đơn giản, tôi muốn chắc chắn rằng tôi có thể làm việc này trước khi tôi bắt đầu thực hiện công việc khó khăn.

Đây là mã tôi đang sử dụng để khám phá các hội đồng:

private static CompositionContainer _container; 
    private const string ASSEMBLY_PATTERN = "*.dll"; 
    private AggregateCatalog _catalog; 

    [ImportMany] 
    IEnumerable<DataAccess.IDataService> services { get; set; } 

    private void button3_Click(object sender, EventArgs e) 
    { 


     _catalog = new AggregateCatalog(
      new DirectoryCatalog(txtLibPath.Text, ASSEMBLY_PATTERN), 
      new AssemblyCatalog(Assembly.GetExecutingAssembly())); 
     _container = new CompositionContainer(_catalog); 
     _container.ComposeParts(this); 
     MessageBox.Show(services.Count().ToString()); 
    } 

Đây là lỗi mà được sản xuất:

Thành phần tạo ra một lỗi phần duy nhất. Nguyên nhân gốc được cung cấp dưới đây. Xem lại thuộc tính CompositionException.Errors để biết thêm thông tin chi tiết.

1) Xuất 'DataAccess.Oracle (ContractName = "DataAccess.IDataService")' không thể gán cho loại 'DataAccess.IDataService'.

Kết quả bằng: Không thể đặt nhập 'MEFTest.Form1.services (ContractName = "DataAccess.IDataService")' trên một phần 'MEFTest.Form1'. Yếu tố: MEFTest.Form1.services (ContractName = "DataAccess.IDataService") -> MEFTest.Form1

Dường như nó không thể gán cho giao diện được thiết kế cho !

Khi vấn đề này được giải quyết, vấn đề tiếp theo của tôi là làm thế nào để chọn một và có được một thể hiện của nó ...

Trả lời

6

Dường như hai phiên bản khác nhau của assembly hợp đồng của bạn (một với DataAccess.IDataService) là được tải. Một có thể là từ đường dẫn thực thi của bạn và đường dẫn khác từ đường dẫn plugin của bạn. Tôi chạm vào vấn đề này một chút trong bài đăng trên blog của tôi trên How to Debug and Diagnose MEF Failures và trang MSDN trên Best Practices for Assembly Loading đi vào chi tiết hơn.

+0

Bạn đã đúng Daniel, tôi đã biên dịch lại IDataService cho các dự án có chứa các trình bổ sung SQLServer và Oracle, nhưng đã tham chiếu một phiên bản cũ hơn trong ứng dụng chính. Tôi đã chuyển IDataService vào một dự án thư viện lớp riêng biệt và tham chiếu rằng từ tất cả ba dự án và tất cả các công trình đều hoàn hảo. Cảm ơn rất nhiều. – hermiod

+0

Đây là vấn đề khá tẻ nhạt. Nó không đủ để chỉ kiểm tra dự án exe của bạn mà còn là dự án của tất cả các cụm vệ tinh mà nó tải. Trong trường hợp của tôi exe tải các dự án của 50 + hội đồng vệ tinh khác và tôi đã có một thời gian khó theo dõi, mà một trong những nguyên nhân này tải trùng lặp. Nếu không phải là một gợi ý tuyệt vời của Daniel, tôi không biết bao nhiêu thời gian tôi có thể chi tiêu giải quyết nó. –

0

Đối với tôi điều này có một sửa chữa rất đơn giản.

Đây là a link! điều đó giải thích nguyên nhân gốc rễ.

Trong trường hợp của tôi, tôi đã khóa phiên bản Lắp ráp của mình xuống, nhưng phiên bản tệp của tôi di chuyển. ID gói nuget của tôi khớp với phiên bản tệp lắp ráp của tôi.

Kết quả cuối cùng là tôi có thể xây dựng liên tục, tạo các nugets mới và không có vấn đề về MEF này.

0

Tôi phải nói rằng tôi đã có lỗi như vậy trong ngữ cảnh hoàn toàn ngu ngốc. Vô tình, tôi đã đặt không đúng chỉ thị xuất và đặt nó vào lớp học nhưng trên một hàm bên trong lớp học:

Đáng ngạc nhiên, mã được biên dịch rất tốt mà không có bất kỳ cảnh báo nào. Nhưng sau đó tôi đã bỏ ra hàng giờ để cố gắng tìm ra lý do tại sao MEF thất bại về những sai lầm ngớ ngẩn của tôi!

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