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ó ...
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
Đâ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ó. –