Tôi đang học MEF và tôi muốn tạo một ví dụ đơn giản (ứng dụng) để xem nó hoạt động như thế nào. Vì vậy, tôi nghĩ về một dịch giả đơn giản. Tôi tạo ra một giải pháp với bốn dự án (file DLL):Việc sử dụng đúng thuộc tính [Nhập] trong MEF
Hợp đồng
Web
BingTranslator
GoogleTranslator
Hợp đồng chứa các giao diện ITranslate
. Như tên áp dụng, nó sẽ chỉ chứa các hợp đồng (giao diện), do đó các nhà xuất khẩu và nhập khẩu có thể sử dụng nó.
public interface ITranslator
{
string Translate(string text);
}
BingTranslator và GoogleTranslator đều xuất khẩu của hợp đồng này. Cả hai đều thực hiện hợp đồng này và cung cấp (xuất) các dịch vụ dịch thuật khác nhau (một từ Bing, một từ Google).
[Export(typeof(ITranslator))]
public class GoogleTranslator: ITranslator
{
public string Translate(string text)
{
// Here, I would connect to Google translate and do the work.
return "Translated by Google Translator";
}
}
và BingTranslator
là:
[Export(typeof(ITranslator))]
public class BingTranslator : ITranslator
{
public string Translate(string text)
{
return "Translated by Bing";
}
}
Bây giờ, trong dự án Web của tôi, tôi chỉ đơn giản muốn nhận được văn bản từ người dùng, dịch nó với một trong những dịch giả (Bing và Google) và trả lại kết quả cho người dùng. Do đó, trong ứng dụng Web của tôi, tôi phụ thuộc vào người dịch. Do đó, tôi đã tạo một bộ điều khiển theo cách này:
public class GeneralController : Controller
{
[Import]
public ITranslator Translator { get; set; }
public JsonResult Translate(string text)
{
return Json(new
{
source = text,
translation = Translator.Translate(text)
});
}
}
và phần cuối cùng của câu đố là dán các thành phần này (để soạn toàn bộ bài hát từ các phần nhỏ hơn). Vì vậy, trong Application_Start
của dự án Web, tôi có:
var parts = new AggregateCatalog
(
new DirectoryCatalog(Server.MapPath("/parts")),
new DirectoryCatalog(Server.MapPath("/bin"))
);
var composer = new CompositionContainer(parts);
composer.ComposeParts();
trong đó /parts
là thư mục nơi tôi thả GoogleTranslator.dll và BingTranslator.dll file (nhà xuất khẩu đang nằm trong những tập tin này) và trong thư mục /bin
Tôi chỉ cần có tệp Web.dll chứa nhà nhập khẩu của mình. Tuy nhiên, vấn đề của tôi là, MEF không điền thuộc tính Translator
của GeneralController
với trình dịch yêu cầu. Tôi đã đọc hầu hết mọi câu hỏi liên quan đến MEF trên trang web này, nhưng tôi không thể tìm ra điều gì sai với ví dụ của mình. Bất cứ ai có thể vui lòng cho tôi biết những gì tôi đã bỏ lỡ ở đây?
Cảm ơn bạn đã trả lời @Aliostad, nhưng thẳng thắn tôi không hiểu tôi nên làm gì để làm cho '[Import]' hoạt động trên thuộc tính 'Translator' của tôi. –
@SaeedNeamati OK, tôi đã cập nhật để minh họa cách sử dụng nó. – Aliostad
Vâng, đây là đối tác cho quan điểm của bạn - MEF là một phần của .NET và một khung DI khá tốt trong chính nó. Việc sử dụng một số khác là trong hầu hết các trường hợp không được chứng minh và chỉ giới thiệu công nghệ KHÁC mà không đạt được (tức là giá trị bảo trì âm). Chỉ cần hoàn thành một dự án 18 tháng CHỈ bằng MEF;) Làm việc khá tốt đẹp. – TomTom