2009-06-25 15 views
2

我已經搜索了很高的內容並查找了有關使用MEF for DI的示例。我知道它不是DI,但是從我聽到的(真的聽到播客)中可以看出來,但我找不到任何博客文章或樣本。使用MEF進行DI/IoC的資源和示例

我在這個項目中已經使用MEF(支持插件),並認爲它也可以很好地利用DI。

也許我在吠叫錯誤的樹?

回答

2

這可以用一個例子來描述。例如,假設您擁有一個基於所有定製應用程序的核心庫。稱之爲MyCompany.Core。通常,您編寫的每個應用程序都必須包含對MyCompany.Core的引用,然後應用程序必須處理引導並調用MyCompany.Core以按正確的順序啓動相應的服務等。當你考慮到核心本身可能知道更好它應該如何被啓動,等

要使用MEF依賴注入這並沒有太大的意義,你的核心這樣做:

[Import("/Application", typeof(IBespokeApplication))] 
private IBespokeApplication bespokeApplication; 

核心本身將包含應用程序啓動代碼,並且可能調用是這樣的,一旦它已經開始了它所有的服務:

bespokeApplication.Start(); 

在定製的應用程序,您必須導出自己:

[Export("/Application", typeof(IBespokeApplication))] 
public class MyApplication : IBespokeApplication 
{ 
    public void Start() 
    { 
     /* start app */ 
    } 
} 

現在,定製的應用程序可以包含對MyCompany.Core的直接引用,並且可以直接調用服務,或者甚至可以將服務公開爲導出並將它們導入到應用程序中。舉例來說,在覈心:

[Export("/LoggingService", typeof(ILoggingService))] 
public class NLogLoggingService : ILoggingService 
{ 
    /* ... */ 
} 

然後在定製的應用程序:

[Import("/LoggingService", typeof(ILoggingService))] 
private ILoggingService loggingService; 

...當你想使用它:

loggingService.LogInformation("My Message"); 

至於我能從文獻中可以看出,這是依賴注入的本質。