我有一個MVC3 Web應用程序,其中控制器使用服務來執行某些任務。 我使用單獨的實例,針對每個動作所需要的服務,像這樣的例子:MVC3中依賴注入與MEF似乎異常緩慢
public ActionResult Index()
{
ICustomService customService = new CustomService();
var list = customService.ReturnSomething();
.....
return View(list)
}
這是工作的罰款。然後我決定使用MEF進行依賴性注入,以遵循更好的設計原則。所以,現在我在做這樣的事情:
public class MyController : Controller
{
[Import]
private ICustomService _customService;
public MyController()
{
MEFManager.Compose(this);
}
public ActionResult Index()
{
var list = _customService.ReturnSomething();
return View(list);
}
凡組成由MEFManage.Compose完成(這)是如下功能:
public static void Compose(object o)
{
var container = new CompositionContainer(
new DirectoryCatalog(Path.Combine(
AppDomain.CurrentDomain.BaseDirectory, "bin"))
);
var batch = new CompositionBatch();
batch.AddPart(o);
container.Compose(batch);
}
這實際工作卻是6到7比我不使用MEF時慢。 有誰知道它爲什麼這麼慢?我做錯了什麼?
我選擇了您建議的第一個解決方案,並在Application_Start中創建一個單一的DirectoryCatalog。它的工作速度很快。謝謝。 Ps:我已經閱讀過有關'保真設計'的文章。網絡「,但沒有理解他們如何幫助我解決這個問題。 – Martin 2012-07-25 09:54:57
@Martin - 這些例子使用我在上面第2項中討論過的實現 - 這與您爲項目採用的方法不同,可能爲什麼他們沒有幫助您。 – 2012-07-25 10:10:10
這就是說,你是目前爲你的構造函數設計的類沒有隱藏它的依賴關係,並且類自身構成了它自己。雖然這確實起作用,但更好的設計是將「ICustomService」作爲參數傳遞給構造函數,因爲這允許API表示其依賴性需求。這會導致你使用Item#2(上面)。 – 2012-07-25 10:12:34