4

我一直在閱讀Microsoft的NLayered域驅動設計體系結構指南書,我想實現MEF作爲我的DI容器。MEF&N域分層驅動設計體系結構的正確解耦

我想通過創建3個項目來測試MEF:只有接口的ContractProject。 ImplementationProject,它具有用Export [typeof(Interface)]註釋實現此接口的類。和一個控制檯應用程序來測試這個。

根據依賴注入原則,高層不應該引用低層,反之亦然。他們都應該引用一個抽象層(接口)。

我試過應用這個。控制檯應用程序引用ContractsProject,而implementationProject引用ContractsProject。但是,如果程序集中沒有ImplentationProject dll,MEF就無法找到EXPORT類。我看過一個教程,他們手動將dll添加到MainApp的bin文件夾中。好處是你不能直接訪問實現方法,避免動態添加引用,但我認爲這是不對的,因爲我必須在每次更改時手動添加dll。並且使用NLayered Domain Driven Design體系結構應用程序,我將需要大量dll。

這是否意味着MEF不是我需要依賴注入的正確工具? (書中使用統一)

下面是代碼:

namespace Contracts 
{ 
    public interface ISampleContract 
    { 
     string DoSomething(); 
    } 
} 

namespace Implementation 
{ 
    [Export(typeof(ISampleContract))] 
    public class Sample : ISampleContract 
    { 
     public string DoSomething() 
     { 
      return "I did something "; 
     } 
    } 
} 

計劃:

namespace Console 
{ 
    class Program 
    { 
     [Import] 
     public ISampleContract sample { get; set; } 

     static void Main(string[] args) 
     { 
      Program p = new Program(); 
      p.Run(); 
     } 

     public void Run() 
     { 
      var catalog = new AggregateCatalog(
      new AssemblyCatalog(Assembly.GetExecutingAssembly()), 
      new DirectoryCatalog(".")); 
      var container = new CompositionContainer(catalog); 

      container.ComposeParts(this); 
      Console.WriteLine(sample.DoSomething()); 
      Console.ReadKey(); 
     } 
    } 
} 

如果我不引用執行DLL在主程序中,ComposeParts()的事情失敗,因爲它找不到與約束匹配的出口......有沒有辦法解決這個問題,而不需要引用dll或者我應該完全選擇另一個DI工具?像Unity一樣,例如?

編輯 它的工作原理,如果我配置實施項目後生成事件將其DLL複製到我的控制檯bin。我不確定這是否是一個好的解決方案?

copy /Y "$(TargetFileName)" "$(SolutionDir)Console\bin\Debug\$(ProjectName).dll" 
+2

順便說一句我不確定MEF是否是控制容器倒置的最佳選擇... –

+0

我剛開始意識到這一點。看起來像MEF尚未提供DI容器的全部功能。 – YL1

+0

然而從未... –

回答

2

你應該確保visual studio實際上是構建Implementation.dll。通常,如果您只生成Console.dll Console.dll,並且它的依賴關係是生成的,則會發生什麼情況。任何DI框架都會有這個問題。

解決此問題的一種方法是進入解決方案 - >屬性 - >項目依賴關係,並在那裏標記構建依賴關係。 (注意,dll將在他們自己的項目bin目錄中,你可能將它們全部部署到插件目錄)

在稍後階段,您可能會或可能不會設置一些更高級的工具來獨立構建和部署你implementation.dll

編輯(我只會在合理的大型項目或項目特定插件的需求做到這一點):團結(和一些其他)的缺點是,它往往發展到創造了巨大的映射文件(迫使你同時擁有構建和代碼依賴)。

+0

標記了構建依賴關係,但它仍然無法解決我的問題。 MEF找不到Export標記的類。所有的DLL都在他們自己的項目bin中,但是MEF仍然無法找到Implementation.dll,如果這個不在控制檯bin文件夾中。調試目錄時,加載的文件只包含Contract.dll文件 – YL1

+0

如果將我的Implementation.dll的生成輸出配置爲我的控制檯的bin文件夾,它將起作用。這是一個好的解決方案嗎? – YL1

+1

我會輸出所有其他項目在「插件」目錄中輸出,然後將DirectoryCatalog的路徑指向該目錄。 (可以更容易地看到什麼是單獨的,什麼不是) 我見過這經常通過與xcopy後構建步驟完成。雖然我個人不是那種解決方案的粉絲。 – Batavia