2010-03-31 28 views
5

Tôi đang làm việc với MEF ngay bây giờ, nhưng câu trả lời tôi đang tìm kiếm có lẽ không liên quan đến MEF - đó là tất cả sự tiêm phụ thuộc - Tôi chỉ sử dụng thuật ngữ MEF làm ví dụ ở đây.Làm cách nào để xuất và nhập dịch vụ ứng dụng bằng MEF?

câu chuyện Short nền, tôi đọc bài viết này qua tại MSDN tập trung vào Composite Applications

Trong con số này có ba điều, vỏ, các dịch vụ ứng dụng và các mô-đun. Đó là ứng dụng tổng hợp.

alt text http://i.msdn.microsoft.com/cc785479.fig02(en-us).gif

Điều tôi chưa nhận được là phần dịch vụ ứng dụng. Dịch vụ là gì, trông nó như thế nào? Làm thế nào để bạn trưng ra một dịch vụ thông qua một mô-đun và làm thế nào để bạn tiêu thụ một dịch vụ từ một mô-đun khác nhau?

Tôi thực sự muốn nhìn thấy một số ví dụ mã nhỏ gọn gàng, không có gì lạ mắt nhưng một cái gì đó để minh họa tất cả điều này đến với cuộc sống (phần dịch vụ ứng dụng).

+5

Mắt tôi, MẮT CỦA TÔI! –

+0

Vâng, lựa chọn màu sắc trong hình ảnh đó thật kinh khủng ... –

Trả lời

3

Dịch vụ ứng dụng, theo như MEF liên quan, chỉ là một phần hợp thành khác. Bất kỳ giao diện hoặc lớp học nào bạn có thể soạn đều có thể hoạt động giống như một dịch vụ.

Mỗi dịch vụ sẽ có một số lớp giao diện hoặc cơ sở bạn muốn triển khai. Bạn có thể thực hiện các thao tác này thông qua một số loại giao diện IService (và sử dụng [ImportMany] để nhập tất cả), nhưng thông thường, bạn sẽ muốn các loại dịch vụ khác nhau.

Sau đó, bạn sẽ nhập khẩu này, theo yêu cầu, vào các lớp học của mình. Ví dụ, nói rằng bạn có một thư viện giao diện phổ biến cho các dịch vụ, và bạn cung cấp:

public interface IDataRepostory 
{ 
    public IList<MyType> MyTypes { get; } 
} 

Sau đó bạn có thể có riêng một loại hình cụ thể xuất khẩu thư viện:

[Export(typeof(IDataRepository))] 
public class Repository: IDataRepostory 
{ 
    // implement interface for this specific "service" 
} 

chương trình chính của bạn sau đó sẽ có thể nhập khẩu này khi cần thiết và viết mã chống lại nó. Ví dụ: giả sử bạn muốn hiển thị khách hàng, bạn cần tải khách hàng từ lớp dữ liệu của mình. Nếu bạn muốn tải thông qua kho lưu trữ của mình, bạn có thể nhập kho lưu trữ vào một phần cụ thể trong đơn đăng ký của mình:

public class CustomersViewModel 
{ 
    [Import] 
    public IDataRepository 
    { 
     get; set; 
    } 

    // ... 
} 

Bạn sẽ nhận dịch vụ này trực tiếp vào ứng dụng của mình.

Đây được coi là "Dịch vụ ứng dụng" vì đây là ứng dụng cụ thể của một số dịch vụ chung - không phải là thành phần liên quan đến chế độ xem và có thể được sử dụng trong toàn bộ ứng dụng của bạn.

+0

Nếu có hơn 1 dịch vụ ứng dụng thỏa mãn việc nhập, bạn sẽ phân biệt như thế nào giữa hai loại này? metadata? đây có phải là cách tốt hơn không? hoặc điều này là sai.Tôi biết MEF ném một ngoại lệ khi điều này xảy ra vì vậy tôi thực sự chỉ muốn 1 giao diện và 1 triển khai cụ thể? –

+0

@ John: Bạn phải sử dụng [ImportMany], sau đó truy vấn dịch vụ hoặc sử dụng Siêu dữ liệu để xác định sử dụng. Nếu không, bạn sẽ nhận được một ngoại lệ. –

+0

@John: Nếu nhiều dịch vụ sử dụng cùng một giao diện/lớp nhập, sau đó sử dụng [ImportMany] và nhập vào IEnumerable

0

Khai báo giao diện cho dịch vụ và lớp xuất đang triển khai giao diện này. Ví dụ: bạn có thể có IPersonBuilder, được khai báo trong hội đồng chia sẻ. Bạn là mô-đun chính có MyPersonBuilder giao diện triển khai và xuất giao diện này. Tất cả Chế độ xem đều sử dụng nhập IPersonBuilder để gọi phương thức trên đó và sử dụng thành phần MEF, chúng có thể gọi số CreatePerson() trên số MyPersonBuilder từ mô-đun chính của bạn.

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